CMake - 仅在需要时将库链接到可执行文件
CMake - Only link a library to an executable if it is needed
我有一个包含多个源文件的项目,我正在使用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()
将完整路径传递给target_link_libraries()
。您可以通过将 get_filename_component() 与ABSOLUTE
arg 一起使用来使路径${PROJECT_NAME}_EXTERNAL_LIBRARIES
绝对的。
相关文章:
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- 在链接可执行文件之前查找静态库未解析的依赖项
- python37.dll在可执行文件中未链接
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 使用共享库编译可执行文件时仅链接所需的符号
- 使用 MINGW 和 CPLEX 库链接从 Linux 编译 Windows 可执行文件
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 静态库中的符号有时会链接到可执行文件中,有时则不会
- CMake - 仅在需要时将库链接到可执行文件
- cusparse功能的多个定义错误在链接可执行文件中的cuda文件时
- G 无法将.O文件链接到可执行文件中
- 为什么 GNU ld 在链接可执行文件和共享对象时以不同的方式解析符号
- 为什么 Linux 上的动态链接可执行文件在其自己的内存空间中具有 libc 的完整内存空间
- Linaro工具链-ARM可执行文件
- c++链接器如何选择将类的哪个定义链接到可执行文件中
- 如何告诉CMake对库链接可执行文件
- 链接可执行到共享库(Android Studio 2.2)
- 用静态库的完整路径链接可执行文件
- 链接可执行文件中的共享库与另一个共享库