我有一个使用CMake管理的庞大项目,这个项目有数百个组件,每个组件都有自己的源文件,每个组件链接到一个库列表,用target_link_libraries(${project} some_libraries, some_other_libraries)
指定
现在,我的目标是:
没有实际修改任何CMakeLists.txt
我希望 ALL 项目的目标可执行文件链接到某些特定库。
有没有办法实现这个目标?由于这是一次性试用,我不想手动搜索所有CMakeLists.txt文件并修改它们(是的,这是另一种选择)。请注意,我使用cmake
(没有cmake gui)从命令行编译整个项目。
答案 0 :(得分:4)
这是一种破解,但对于C ++项目,您可以使用CMAKE_CXX_STANDARD_LIBRARIES
。对于C项目,我认为你会使用CMAKE_C_STANDARD_LIRBARIES
。
链接到libbar
和libfoo
的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_LIBRARIES
和INTERFACE_LINK_LIBRARIES
目标属性。