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