我有一个关于MAC中的CMake的问题。我确保可执行程序将使用以下代码正确链接框架和库:
link_directories(directory_to_framework_and_libs)
add_executable(program ${FILE_LIST})
target_link_libraries(program framework_name lib1 lib2)
在第一行代码中,我指出了可执行程序可以在其中搜索框架和库的位置。在第三行代码中,框架和库将链接到可执行程序。然而,当我编译xcode。用Xcode 4从cmake文件创建的项目,项目一直抱怨它找不到-lframework_name
: ld: library not found -lframework_name
。
你不能用这种方式链接到一个框架,你必须使用find_library
,因为它包含了OSX框架的一些特殊处理。
另外,不要使用link_directories
,使用库的完整路径,这是不需要的。
下面是一些简单的AudioUnit示例:
find_library(AUDIO_UNIT AudioUnit)
if (NOT AUDIO_UNIT)
message(FATAL_ERROR "AudioUnit not found")
endif()
add_executable(program ${program_SOURCES})
target_link_libraries(program ${AUDIO_UNIT})
另一种解决方案如下:
target_link_libraries(program "-framework CoreFoundation")
target_link_libraries(program "-framework your_frame_work_name")
set_target_properties(program PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks")
您不需要所有这些麻烦(至少使用cmake 2.8.12)。
target_link_libraries(program stdc++ "-framework Foundation" "-framework Cocoa" objc)
当CMake看到一个以"-"开头的链接参数时,它不会在前面加上"-l",而是按原样将参数传递给链接器(/usr/bin/c++)。
您需要框架的引号,以便CMake将两个单词视为单个条目,并且不会在"Foundation"之前添加"-l"。
For cmake version 3.20.1
https://github.com/Sunbreak/cli-breakpad.trial/blob/1800b187afd5f0c29368196561ddb6b55123d4a0/CMakeLists.txt L10-L12
if(APPLE)
find_library(BREAKPAD_CLIENT Breakpad "${CMAKE_CURRENT_SOURCE_DIR}/breakpad/mac/")
target_link_libraries(cli-breakpad PRIVATE ${BREAKPAD_CLIENT})
对于最新版本的CMake,
target_link_libraries(program PRIVATE "-framework framework_name")