CMake的:链接库到库(CMake: Link a library to library)

2019-08-07 21:30发布

我有一个的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看到的是外部库(它是在这个项目的依赖库),当然找不到了。

问题是什么?

Answer 1:

我认为这是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变量的作用域


Answer 2:

我猜的麻烦可能是* 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”联动,给你更多它的工作机会;)



文章来源: CMake: Link a library to library
标签: cmake