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

i7uaboj4  于 9个月前  发布在  Mac
关注(0)|答案(6)|浏览(203)

我有一个关于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任何想法都将受到赞赏。

8ehkhllq

8ehkhllq1#

你不能以这种方式链接到框架,你必须使用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})

字符串

k75qkfdt

k75qkfdt2#

另一种解决方案如下:

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")

字符串

w80xi6nr

w80xi6nr3#

您不需要所有这些麻烦(至少在cmake 2.8.12中是这样)。
这很好用:

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

字符串
当CMake看到一个以“-"开头的链接参数时,它不会在前面加上“-l”,而是按原样将参数传递给链接器(/usr/bin/c++)。
您需要为框架加上引号,以便CMake将这两个单词视为单个条目,而不会在“Foundation”之前添加“-l”。

ntjbwcob

ntjbwcob4#

对于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})

字符串

li9yvcax

li9yvcax5#

我用@Guillaume的评论写了这篇文章:

if (APPLE)
    find_library(COCOA Cocoa)
    if (NOT COCOA)
        message(FATAL_ERROR "Cocoa not found")
    endif()
    target_link_libraries(yourtarget PRIVATE ${COCOA})
endif()

字符串
这对我来说效果最好,因为它不能在其他平台上运行,甚至可以在目标是库(add_library)时使用。你可以用任何你想要的ofc来替换可可框架。

cngwdvgl

cngwdvgl6#

对于最新版本的CMake,

target_link_libraries(program PRIVATE "-framework framework_name")

字符串

相关问题