15

我有一个与 MAC 中的 CMake 相关的问题。我确保可执行程序将使用以下代码正确链接框架和库:

link_directories(directory_to_framework_and_libs)
add_executable(program ${FILE_LIST})
target_link_libraries(program framework_name lib1 lib2)

在第一行代码中,我表示可执行程序可以搜索框架和库的位置。在第三行代码中,框架和库将链接到可执行程序。但是,当我使用 Xcode 4 编译从 cmake 文件创建的 xcode.project 时,该项目一直抱怨找不到-lframework_nameld: library not found -lframework_name任何想法都会受到赞赏。

4

4 回答 4

28

您不能以这种方式链接到框架,您必须使用它,find_library因为它包含对 OSX 上的框架的一些特殊处理。

另外,不要使用link_directories, CMake 使用库的完整路径,这不是必需的。

这是 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})
于 2013-06-12T19:39:19.990 回答
23

另一种解决方案如下:

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")
于 2013-08-20T08:41:27.890 回答
17

您不需要所有这些麻烦(至少对于 cmake 2.8.12)。

这工作正常:

target_link_libraries(program stdc++ "-framework Foundation" "-framework Cocoa" objc)

当 CMake 看到以“-”开头的链接参数时,它不会在前面加上“-l”,而是将参数按原样传递给链接器 (/usr/bin/c++)。

您需要框架的引号,以便 CMake 将这两个单词视为一个条目,并且不会在“Foundation”之前添加“-l”。

于 2014-08-13T12:39:33.453 回答
0

对于 cmake 版本 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})
于 2021-09-22T01:53:11.130 回答