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

Fer*_*eak 7 cmake

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

现在,我的目标是:

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

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

Dav*_*son 10

这是一种技巧,但对于 C++ 项目,您可以使用CMAKE_CXX_STANDARD_LIBRARIES. 对于 C 项目,我认为您会使用CMAKE_C_STANDARD_LIRBARIES.

链接到libbar和 的C++ 示例libfoo

cmake ... -DCMAKE_CXX_STANDARD_LIBRARIES="-lbar -lfoo"
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档:

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

这不适用于旧版本的 CMake;它是在 3.0 版本之后添加的。


Com*_*sMS 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()
Run Code Online (Sandbox Code Playgroud)

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

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

为了对链接的内容进行更细粒度的控制,target_link_libraries您还可以直接修改LINK_LIBRARIESINTERFACE_LINK_LIBRARIEStarget 属性,而不是调用。