CMake:将库链接到库

Ov3*_*oad 18 cmake

我有cmake的问题.我有,比方说,CMakeLists1有一个CMakeLists2所在的子目录.

在CMakeLists2中,我的目标是一个静态库.我想将它链接到外部库.我就这样做了:

link_directories ("path_to_library")
add_library (project2 ${sources})
target_link_libraries (project2 "name_of_external_lib")
Run Code Online (Sandbox Code Playgroud)

然后,我想在我的project1中使用这个project2中的一个类.我是这样做的:

add_executable (project1 ${sources})
target_link_libraries (project1 project2)
Run Code Online (Sandbox Code Playgroud)

但这根本不起作用.首先,project2没有链接到外部库.只是为了检查,我通过vs10项目属性添加了这个库,并且大小不同.第二件事,不知何故,project1看到了外部库(它在这个项目的库依赖项中),当然找不到它.

问题是什么?

gui*_*ini 8

我认为CMake的默认行为是不将project2链接到外部库,而是将两个库链接到可执行文件.从"掌握CMake"一书.

由于静态库不链接到它们所依赖的库,因此CMake必须跟踪库,以便可以在正在创建的可执行文件的链接行上指定它们.

您可以尝试在CMakeLists2中使用绝对路径:

add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")
Run Code Online (Sandbox Code Playgroud)

或者你可以添加

link_directories ("path_to_library")
Run Code Online (Sandbox Code Playgroud)

到project1的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} )
Run Code Online (Sandbox Code Playgroud)

然后,您可以将您的可执行文件与$ {BIG_LIB}链接.

你需要考虑的一些事情:

  • 也许你必须使用LOCATION_CONFIG(CMake文档,我在这个答案中找到了get_property命令)
  • link.exe必须在您的路径中
  • 如果要在其他CMakeLists.txt中使用它,请观察BIG_LIB变量的范围