从命令行指定要链接到cmake的库

13

我有一个使用CMake管理的大型项目,该项目有数百个组件,每个组件都有自己的源代码文件,并且每个组件都链接到指定的库列表,例如 target_link_libraries(${project} some_libraries, some_other_libraries)

现在,我的目标是:

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

有没有实现这个目标的方法?由于这只是一次性尝试,我不想手动查找所有的CMakeLists.txt文件并对其进行修改(是的,这是另一种替代方案)。请注意,我使用cmake从命令行编译整个项目(没有cmake gui)。

2个回答

16

这有点像一个技巧,但对于一个C++项目,您可以使用CMAKE_CXX_STANDARD_LIBRARIES。 对于C项目,我认为您会使用CMAKE_C_STANDARD_LIRBARIES

C++示例链接到libbarlibfoo

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

查看此处的文档:

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

对于较老版本的CMake,此选项可能不可用;它是在3.0版本之后的某个时间添加的。


六年后肯定会有更简洁的解决办法,对吧? - undefined

3

这是一种不太正规的方法,请仅在测试时使用。

实际上,您可以通过定义一个同名函数来重载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
如果需要更精细的控制链接内容,而不是调用 target_link_libraries,您还可以直接操作 LINK_LIBRARIESINTERFACE_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),它就可以工作了 :( - Ferenc Deak
1
@fritzone 我明白了。在这种情况下,请不要直接调用 target_link_libraries。相反,将所有可执行文件的名称保存到列表中。然后,在您的顶层 CMakeLists 的 _最后_,使用 foreach 遍历该列表并在那里调用 target_link_libraries - ComicSansMS
这确实是一个很好的想法,我非常喜欢它,但不幸的是它不能工作:CMakeLists.txt:87 (target_link_libraries) 中的 CMake 错误: 尝试将链接库“pthread”添加到目标“CoreMessageUnitTests”,但该目标未在此目录中构建。 - Ferenc Deak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接