提问人:Ferenc Deak 提问时间:8/11/2014 最后编辑:Ferenc Deak 更新时间:3/24/2017 访问量:11913
指定要从命令行链接到的 cmake 库
Specifying libraries for cmake to link to from command line
问:
我有一个用 CMake 管理的庞大项目,这个项目有数百个组件,每个组件都有自己的源文件,每个组件都链接到一个库列表,指定target_link_libraries(${project} some_libraries, some_other_libraries)
现在,我的目标是:
在不实际修改任何我希望所有项目的目标可执行文件链接到某些特定库的情况下。CMakeLists.txt
有没有办法实现这一目标?由于这是一次试用,我不想手动查找所有 CMakeLists.txt 文件并修改它们(是的,这是另一种选择)。请注意,我从命令行编译整个项目,使用(没有 cmake gui)。cmake
答:
这是一个肮脏的黑客,所以请只用它来测试。
实际上,您可以通过定义同名函数来重载命令。在靠近顶层顶部的位置执行此操作:add_executable
CMakeLists.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_LIBRARIES
并INTERFACE_LINK_LIBRARIES
目标属性。target_link_libraries
评论
-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
foreach
并调用该列表。target_link_libraries
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.
这是一种黑客攻击,但对于 C++ 项目,您可以使用 .对于 C 项目,我想你会使用 .CMAKE_CXX_STANDARD_LIBRARIES
CMAKE_C_STANDARD_LIRBARIES
链接到 和 的 C++ 示例:libbar
libfoo
cmake ... -DCMAKE_CXX_STANDARD_LIBRARIES="-lbar -lfoo"
请参阅此处的文档:
https://cmake.org/cmake/help/v3.6/variable/CMAKE_LANG_STANDARD_LIBRARIES.html
这不适用于旧版本的 CMake;它是在 3.0 版之后的某个时间添加的。
评论