使用cmake链接自编译的静态库

时间:2018-03-13 10:49:36

标签: c++ linux cmake

我尝试为项目编写一些测试。如果我需要一些项目文件,我会写include_directories语句,所有内容都将被包含在内。如果需要一些手动编译的静态库,我尝试设置target_link_libraries

如果我设置了绝对路径,那么所有链接都可以,但是对于任务我需要另一种方法来链接另一个库,因为库的相对路径给出了未定义的引用。

在这种情况下一切正常:

target_link_libraries(ConsoleDumperTest GTest::GTest GTest::Main PocoFoundation PocoUtil PocoNet ${YAML_LIBRARIES})
target_link_libraries(ConsoleDumperTest /home/yrusinov/projects/build-fleetd-2-Desktop-dbg/protocols/libprotocols.a)
target_link_libraries(ConsoleDumperTest /home/yrusinov/projects/build-fleetd-2-Desktop-dbg/consumers/libconsumers.a)
target_link_libraries(ConsoleDumperTest /home/yrusinov/projects/build-fleetd-2-Desktop-dbg/consumers/Console/libconsole.a)

但如果我这样做:

target_link_libraries(ConsoleDumperTest GTest::GTest GTest::Main PocoFoundation PocoUtil PocoNet ${YAML_LIBRARIES})
target_link_libraries(ConsoleDumperTest ../../../protocols/libprotocols.a)
target_link_libraries(ConsoleDumperTest ../../../consumers/libconsumers.a)
target_link_libraries(ConsoleDumperTest ../../../consumers/Console/libconsole.a)

我接收到未定义的引用,尽管库中包含了目录。我必须设置链接库的路径?

2 个答案:

答案 0 :(得分:2)

根据documentationtarget_link_libraries预计不会与相对路径一起使用:您应该使用绝对路径或库的名称

通过了解相对路径,很容易在CMake中构造绝对路径。例如,假设您知道当前源目录(当前包含的目录CMakeLists.txt)的相对路径,请使用 CMAKE_CURRENT_SOURCE_DIR 变量:

target_link_libraries(ConsoleDumperTest
    ${CMAKE_CURRENT_SOURCE_DIR}/../../../protocols/libprotocols.a
)

答案 1 :(得分:1)

CMake的link_directories(...)命令提供了这个:

  

link_directories(directory1 directory2 ...)

     

指定链接器应搜索库的路径。该命令仅适用于调用后创建的目标。给予此命令的相对路径被解释为相对于当前源目录,请参阅CMP0015。

另请注意,如果使用add_library(target_name ...)在同一CMake项目中定义了这些库依赖项,则可以在target_link_libraries中指定目标名称而不是二进制名称。