为什么我不能链接Mac框架文件与CMake



我有一个关于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")

最新更新