考虑一个在git存储库中组织的C ++项目。假设git存储库有一个子模块,从该子模块构建(超级)项目所依赖的库。如果(超级)项目不仅依赖于库而且依赖于使用特定(CMake)参数构建的库,那么在构建(超级)项目时如何确保使用这些参数构建子模块?
答案 0 :(得分:1)
必须将构建选项(如MYLIB_WITH_SQLITE
)添加到库的接口,即在旧学校配置模块的情况下添加到MYLIB_DEFINITIONS
变量,或者添加到{ {1}}属性,如果库使用INTERFACE_COMPILE_DEFINITIONS
命令创建其配置模块:
install(EXPORT ...)
在使用库或可执行文件中,您可以编写简单的编译时检查:
add_library(mylib ...)
if(MYLIB_WITH_SQLITE)
target_compile_definitions(mylib PUBLIC MYLIB_WITH_SQLITE)
endif()
...
install(TARGETS mylib EXPORT mylib-targets ...)
install(EXPORT mylib-targets ...)
答案 1 :(得分:0)
CMake支持ExternalProject_Add
的外部项目,您可以根据自己的喜好定义编译标记。用它来构建你的子模块。
更多详情:https://cmake.org/cmake/help/v3.2/module/ExternalProject.html
答案 2 :(得分:-1)
我认为最简单的答案是使用此SO answer中所述的-C
选项。
答案 3 :(得分:-1)
我考虑的一个解决方案是分叉子模块的repo,编辑CMakeLists.txt以便更具体,然后将forked repo的HEAD修订版包含为子模块。不雅但可以接受。