Why I cannot link the Mac framework file with CMak

2020-06-15 06:09发布

问题:

I have a question related to CMake in MAC. I make sure that the executable program will link the framework and libraries correctly with the following codes:

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

In the first line code, I denote the location where the executable program can search for the framework and libraries. In the third line code, the framework and the libraries will link to the executable program. However, when I compile the xcode.project created from the cmake file with Xcode 4, the project keeps complaining that it cannot find -lframework_name: ld: library not found -lframework_name Any ideas will be appreciated.

回答1:

You can't link to a framework this way, you have to use find_library as it includes some special handling for frameworks on OSX.

Also, don't use link_directories, CMake use full paths to libraries and it's not needed.

Here's some simple example with 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})


回答2:

Another solution is as follows:

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


回答3:

You do not need all this hassle (at least with cmake 2.8.12).

This works fine:

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

When CMake sees a link parameter starting with "-", it does not prepend "-l" and passes the argument as-is to the linker (/usr/bin/c++).

You need the quotes for frameworks so that CMake treats the two words as a single entry and does not add "-l" before "Foundation" for example.



标签: cmake