我有一个的CMake问题。 我有,可以说,CMakeLists1其中有一个子目录,其中CMakeLists2是。
在CMakeLists2我的目标是一个静态库。 我想它链接到外部库。 我将它就像这样:
link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")
于是,我想用一个类从该项目2在我PROJECT1。 我做了这样的说法:
add_executable (project1 ${sources})
target_link_libraries (project1 project2)
但是,这并不在所有的工作。 首先,项目2没有链接到外部库。 只是为了检查,我添加了通过VS10项目属性这个库,以及大小是不同的。 第二件事,不知何故PROJECT1看到的是外部库(它是在这个项目的依赖库),当然找不到了。
问题是什么?
我认为这是CMake的默认行为不链接项目2到外部库,但对两个库链接到可执行文件。 从书“掌握CMake的”。
因为静态库不链接到它们所依赖的库,为CMake的跟踪库,使他们能够创建的可执行文件存在的链接行上指定是非常重要的。
你可以尝试在你的CMakeLists2使用绝对路径:
add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")
或者你可以添加
link_directories ("path_to_library")
到Project的CMakeLists文件。
如果你真的想这样做在Visual Studio中,你很可能在此给出的命令答案打造一个的CMake custom_command。 或许,这将是这个样子(我没有测试)。
set(EXT_LIB "path_to_library/name_of_external_lib")
set(BIG_LIB "path_to_big_lib/name_of_big_lib")
add_library (project2 ${sources})
get_property(PROJ2_LOC TARGET project2 PROPERTY LOCATION)
add_custom_command(OUTPUT ${BIG_LIB}
DEPENDS ${EXT_LIB} project2
COMMAND "lib.exe /OUT:${BIG_LIB} ${EXT_LIB} ${PROJ2_LOC} )
然后,你可以用$ {} BIG_LIB链接您的可执行文件。
有些事情你必须要考虑:
- 也许你不得不使用LOCATION_CONFIG( CMake的文档 ,我发现在get_property命令这个答案 )
- LINK.EXE必须是在你的路径
- 如果你想在其他的CMakeLists.txt使用它观看BIG_LIB变量的作用域
我猜的麻烦可能是* name_of_external_lib *是不正确的,因此它不能找到它。
我会去的:
find_library(
LIB_I_NEED name_of_external_lib
HINTS "path_to_library"
)
if(${LIB_I_NEED} STREQUAL "LIB_I_NEED-NOTFOUND")
message(FATAL_ERROR "Couldn't find the 'external_lib' library)
endif()
message(STATUS "Found 'external_lib' at: ${LIB_I_NEED}")
add_library (project2 ${sources})
target_link_libraries (project2 ${LIB_I_NEED})
如果没有帮助,必须在cmake的文档的例子中的快速阅读:
http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:target_link_libraries
它提到一件事情有:
虽然一个重复通常是足够的,病理对象文件和符号的安排可以要求更多。 一个可以通过在最后target_link_libraries呼叫手动重复分量处理这样的情况下
所以,我要说的另一件事尝试可能会在项目2:
set(PROJECT_2_LIBS project2 "name_of_external_lib" PARENT_SCOPE)
那么在EXE:
target_link_libraries (project1 ${PROJECT_2_LIBS})
这将在两次地重复“external_lib”联动,给你更多它的工作机会;)