CMake - 仅在需要时将库链接到可执行文件

时间:2017-09-04 15:52:09

标签: c++ qt cmake linker shared-libraries

我有一个包含多个源文件的项目,我正在使用GoogleTest库为其中一些源文件创建单元测试。测试都是单独的.cpp文件,每个文件都包含要测试的相应源文件的标题。

我想为每个单元测试创​​建一个单独的可执行文件。为此,我有一个循环,为test_sources列表中的每个成员创建一个可执行文件,并根据test_names列表命名。

问题是我的几个单元测试需要另一个第三方库。该库在${${PROJECT_NAME}_EXTERNAL_LIBRARIES})列表中定义。我试图将它链接到我的文本可执行文件,但我得到错误:

Error: No rule to make target 'PocoNetExternal/Foundation/libPocoFoundationd.so', needed by 'StringExTest'.  Stop.

这是因为StringExTest是不需要POCO库的测试之一。如果我删除了指向POCO的链接,那么对于需要POCO的可执行文件,我会收到undefined reference错误。有趣的是,如果我把链接重新放入并再次构建,所有编译并运行正常且没有错误。不幸的是,这还不够好,因为我需要它第一次工作,所以它可以在我们的持续集成服务器上运行。

以下是将Gtest和Poco链接到可执行文件的代码。如何更改此选项以便仅在需要时链接POCO?如果添加或删除其他测试,此代码也需要可以重复使用而无需修改。

##########################################################################
##### Loop over all the .cpp files and create separate executables

list(LENGTH test_sources len1)              #len1 is length of test_sources list
math(EXPR len2 "${len1} - 1")               #len2 is len1 - 1

foreach(val RANGE ${len2})              #for val = 0 to len2
  list(GET test_names ${val} name)          #name will change on every loop
  list(GET test_sources ${val} src)         #list(GET <list> <element index> <output variable>)
  add_executable("${name}" "${src}" "${test_files}")    #add_executable(<name> source1 [source2 ...])
endforeach()

##########################################################################
###### Link the libraries

makeLibPathsAbsolute()

foreach(val RANGE ${len2})                          #for val = 0 to len2
    list(GET test_names ${val} name)                    #name will change on every loop
    target_link_libraries(${name} gtest_main)               #link gtest libraries
    message(STATUS "LINKING: ${external_libraries_abs} to ${name}\n")
    target_link_libraries(${name} ${external_libraries_abs})    #link all other libraies (give the absolute path path)
endforeach()

1 个答案:

答案 0 :(得分:2)

将完整路径传递给target_link_libraries()。您可以使用get_filename_component()${PROJECT_NAME}_EXTERNAL_LIBRARIES arg一起使用ABSOLUTE绝对路径。