我尝试为项目编写一些测试。如果我需要一些项目文件,我会写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)
我接收到未定义的引用,尽管库中包含了目录。我必须设置链接库的路径?
答案 0 :(得分:2)
根据documentation,target_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
中指定目标名称而不是二进制名称。