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

时间:2014-08-11 12:29:26

标签: cmake

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

现在,我的目标是:

没有实际修改任何CMakeLists.txt我希望 ALL 项目的目标可执行文件链接到某些特定库。

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

2 个答案:

答案 0 :(得分:4)

这是一种破解,但对于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之后添加了一段时间。

答案 1 :(得分:1)

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

您实际上可以通过定义同名函数来重载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目标属性。