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

Specifying libraries for cmake to link to from command line

提问人:Ferenc Deak 提问时间:8/11/2014 最后编辑:Ferenc Deak 更新时间:3/24/2017 访问量:11913

问:

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

现在,我的目标是:

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

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

cmake的

评论


答:

3赞 ComicSansMS 8/11/2014 #1

这是一个肮脏的黑客,所以请只用它来测试。

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

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

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

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

为了更精细地控制链接的内容,除了调用之外,您还可以直接弄乱LINK_LIBRARIESINTERFACE_LINK_LIBRARIES目标属性。target_link_libraries

评论

0赞 Ferenc Deak 8/11/2014
确实按预期添加了库(libz pthread)......但是它会将它们添加到库列表的开头,所以我得到:不幸的是,链接器失败了:......如果我手动添加到编译命令的末尾(如:),它可以:(-rdynamic -lz -lpthread ../../libfappcore.a -lQtXml -lQtSql -lQtNetwork -lQtCore ../../../externals/gmock/libgmock.a ../../../externals/gmock/gtest/libgtest.aundefined reference to symbol 'deflate'-rdynamic ../../libfappcore.a -lQtXml -lQtSql -lQtNetwork -lQtCore ../../../externals/gmock/libgmock.a ../../../externals/gmock/gtest/libgtest.a -lz -lpthread
1赞 ComicSansMS 8/11/2014
@fritzone我明白了。在这种情况下,请勿直接拨打电话。相反,请将可执行文件的所有名称保存到列表中。然后,顶级 CMakeLists 的最末尾,对列表进行 foreach 并调用该列表。target_link_librariestarget_link_libraries
0赞 Ferenc Deak 8/12/2014
这确实是一个好主意,我非常喜欢它,不幸的是不起作用: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.
16赞 David Grayson 3/24/2017 #2

这是一种黑客攻击,但对于 C++ 项目,您可以使用 .对于 C 项目,我想你会使用 .CMAKE_CXX_STANDARD_LIBRARIESCMAKE_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 版之后的某个时间添加的。

评论

0赞 nbubis 11/5/2023
六年后,一定有更干净的黑客,对吧?