为 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
。
链接到libbar
和libfoo
的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_LIBRARIES
和INTERFACE_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 指定库以从命令行链接到的主要内容,如果未能解决你的问题,请参考以下文章
GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”
如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1