来自FindBoost.cmake
CMake 3.8的模块:
foreach(COMPONENT ${Boost_FIND_COMPONENTS})
if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT})
string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
if(Boost_${UPPERCOMPONENT}_FOUND)
if(Boost_USE_STATIC_LIBS)
add_library(Boost::${COMPONENT} STATIC IMPORTED)
else()
# Even if Boost_USE_STATIC_LIBS is OFF, we might have static
# libraries as a result.
add_library(Boost::${COMPONENT} UNKNOWN IMPORTED)
endif()
以及相应的评论该模块的文档 https://cmake.org/cmake/help/v3.8/module/FindBoost.html:
需要注意的是,导入的目标的行为与此模块创建的变量不同:在同一目录或具有不同选项(例如静态或共享)的子目录中多次调用 find_package(Boost) 不会覆盖目标的值由第一次调用创建。
我看到不设定目标的合理性GLOBAL
.
然而,使它们全球化的首选方式是什么?
我习惯于在子目录中定义项目的依赖项,包括任何find_package(...)
来电。因此,Boost 导入的目标在其他目录中不可用,例如/tests/CMakeLists.txt
:
<project_root>
/3rdparty
/git-submodule-of-a-small-lib
/CMakeLists.txt
/include
/...
/tests
/CMakeLists.txt
/CMakeLists.txt
有一个IMPORTED_GLOBAL https://cmake.org/cmake/help/latest/prop_tgt/IMPORTED_GLOBAL.htmlCMake >= 3.11 中的目标属性:
set_target_properties(Boost::unit_test_framework PROPERTIES IMPORTED_GLOBAL TRUE)
对于旧版本:find_package()
使用标准add_library()
调用,因此您可以随时更改/扩展其功能以拥有IMPORTED
始终有目标GLOBAL
类似的东西:
3rdparty\CMakeLists.txt
function(add_library)
set(_args ${ARGN})
if ("${_args}" MATCHES ";IMPORTED")
list(APPEND _args GLOBAL)
endif()
_add_library(${_args})
endfunction()
find_package(Boost REQUIRED COMPONENTS unit_test_framework)
免责声明
正如 @CraigScott 评论的那样,覆盖 CMake 的内置函数是危险的:
- [CMake] 使用函数重写时无限循环 https://cmake.org/pipermail/cmake/2011-March/043320.html
- CMake 问题 #14357:多次定义 add_library 的覆盖宏/函数会导致分段错误 https://gitlab.kitware.com/cmake/cmake/issues/14357
参考
- CMake 问题 #1254:添加新的目标属性IMPORTED_GLOBAL https://gitlab.kitware.com/cmake/cmake/merge_requests/1254
- CMake 问题 #1222:[线程、Boost] 创建具有 GLOBAL 范围的 IMPORTED 目标的选项 https://gitlab.kitware.com/cmake/cmake/merge_requests/1222
- CMake 问题 #17256:可以将 IMPORTED 目标提升为 IMPORTED GLOBAL https://gitlab.kitware.com/cmake/cmake/issues/17256
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)