为 cmake 指定库以从命令行链接到

Posted

技术标签:

【中文标题】为 cmake 指定库以从命令行链接到【英文标题】:Specifying libraries for cmake to link to from command line 【发布时间】:2014-08-11 12:29:26 【问题描述】:

我有一个用 CMake 管理的大型项目,这个项目有数百个组件,每个组件都有自己的源文件,每个组件都链接到一个库列表,由 target_link_libraries($project some_libraries, some_other_libraries) 指定

现在,我的目标是:

在不实际修改任何 CMakeLists.txt 的情况下,我希望 ALL 项目的目标可执行文件链接到某些特定库。

有没有办法做到这一点?由于这是一次试用,我不想手动搜索所有 CMakeLists.txt 文件并修改它们(是的,这是另一种选择)。请注意,我从命令行编译整个项目,使用 cmake(无 cmake gui)。

【问题讨论】:

【参考方案1】:

这是一种 hack,但对于 C++ 项目,您可以使用 CMAKE_CXX_STANDARD_LIBRARIES。对于 C 项目,我想你会使用 CMAKE_C_STANDARD_LIRBARIES

链接到libbarlibfoo 的C++ 示例:

cmake ... -DCMAKE_CXX_STANDARD_LIBRARIES="-lbar -lfoo"

在此处查看文档:

https://cmake.org/cmake/help/v3.6/variable/CMAKE_LANG_STANDARD_LIBRARIES.html

这不适用于旧版本的 CMake;它是在 3.0 版本之后的某个时间添加的。

【讨论】:

【参考方案2】:

这是一个肮脏的,肮脏的黑客,所以请仅用于测试。

您实际上可以通过定义同名函数来重载add_executable 命令。在顶层CMakeLists.txt的顶部附近执行此操作:

function (add_executable name)
    message("Added executable: " $name)
    _add_executable($name $ARGN)
    target_link_libraries($name$ your_additional_lib)
endfunction()

请注意,_add_executable 是一个内部 CMake 名称,可能会在未来的 CMake 版本中中断。截至目前(3.0 版),它似乎适用于所有版本。

如果需要,您可以使用相同的方式重载 add_library

要对链接的内容进行更细粒度的控制,您也可以直接使用LINK_LIBRARIESINTERFACE_LINK_LIBRARIES 目标属性,而不是调用target_link_libraries

【讨论】:

确实按预期添加了库(libz pthread)......但是它将它们添加到库列表的开头,所以我得到:-rdynamic -lz -lpthread ../../libfappcore.a -lQtXml -lQtSql -lQtNetwork -lQtCore ../../../externals/gmock/libgmock.a ../../../externals/gmock/gtest/libgtest.a 不幸的是链接器失败:undefined reference to symbol 'deflate' .. . 如果我手动添加到编译命令的末尾(如:-rdynamic ../../libfappcore.a -lQtXml -lQtSql -lQtNetwork -lQtCore ../../../externals/gmock/libgmock.a ../../../externals/gmock/gtest/libgtest.a -lz -lpthread)它可以工作:( @fritzone 我明白了。在这种情况下,不要直接拨打target_link_libraries。相反,将所有可执行文件的名称保存到一个列表中。然后,在您的*** CMakeLists 的最后foreach 在列表上方并在那里调用target_link_libraries 这确实是一个绝妙的主意,我非常喜欢它,可惜行不通:CMake Error at CMakeLists.txt:87 (target_link_libraries): Attempt to add link library "pthread" to target "CoreMessageUnitTests" which is not built in this directory.

以上是关于为 cmake 指定库以从命令行链接到的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CMake在链接命令行的末尾添加标志?

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1

将 CMake 选项从命令行移动到*** CMakeLists.txt

在 XCode 4.3 中从命令行构建时链接任意库

将CMake变量从GUI导出到命令行