创建目录层次结构,独立构建子目录
CMake directory hierarchy, building a sub-directory independently
我目前正在处理一个不太理想的CMake设置,我正在努力纠正。顶级的cmakelistmain .txt包含编译器设置,包括目录、宏等,所有项目都依赖和使用这些设置。我的源代码树包含许多项目,但我在这里缩小了它。
src/
CMakeListsMain.txt
project1/
-->CMakeLists.txt
project2/
-->CMakeLists.txt
headers/
-->source headers for every project
例如cmakelistmain .txt看起来像这样,但更复杂:
MACRO(USE_BOOST target)
target_link_libraries(${target} boost_thread-mt boost_filesystem-mt boost_regex-mt boost_system-mt)
ENDMACRO(USE_BOOST)
MACRO(USE_PTHREAD target)
target_link_libraries(${target} pthread)
ENDMACRO(USE_PTHREAD)
add_subdirectory(project1)
add_subdirectory(project2)
项目1和项目2都使用了顶层的宏和其他设置CMakeListsTop.txt
以前,如果我想构建一个项目,CMake将不得不在每个目录上运行,这是不好的。
我的问题是,如果我想单独构建每个项目,我如何访问这些宏和其他设置。目前,我已经抽象出的宏到一个不同的文件,并已包括该文件在每个项目的CMakeLists.txt。这样做,我还必须使用绝对路径来引用源树中的头文件,而不是使用CMAKE_SOURCE_DIR/headers
。
如果没有得到批准,我真的不能改变源代码树的布局,但是有没有更简单的方法来做到这一点,或者我忽略了什么?
添加此宏
MACRO(ADD_PROJECT PROJECT)
IF(${PROJECT} OR ALL)
add_subdirectory(${PROJECT})
ENDIF()
ENDMACRO()
到顶级CMakeLists.txt中,并将所有出现的add_subdirectory
替换为
ADD_PROJECT(project1)
ADD_PROJECT(project2)
等等。现在您可以通过调用cmake来构建任何单个项目,标记-Dproject1=1
等,或者使用-DALL=1
来构建整个项目。
您可以将宏和设置移到模块中。然后,你可以将模块包装在一个包含保护中,以确保它只执行一次,并从每个需要独立构建的CMakeLists.txt中包含它。
对于您的示例,模块文件看起来像:IF(NOT DEFINED MAIN_SETTINGS_INCLUDED)
SET(MAIN_SETTINGS_INCLUDED ON)
MACRO(USE_BOOST target)
target_link_libraries(${target} boost_thread-mt boost_filesystem-mt boost_regex-mt boost_system-mt)
ENDMACRO(USE_BOOST)
MACRO(USE_PTHREAD target)
target_link_libraries(${target} pthread)
ENDMACRO(USE_PTHREAD)
ENDIF()
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- 节点构建失败。无法在包含目录的子目录中找到库头文件
- CMake在添加为子目录时不构建库
- 使用子目录中的包含进行构建
- 如何在 rstudio 上为在子目录内的 src 文件夹中使用 C/C++ 文件的包构建和加载共享库
- 创建目录层次结构,独立构建子目录
- 如何使用cmake在子目录中构建库
- 如何构建具有多个相互依赖子目录的c++项目
- Android NDK:子目录下的代码根本没有构建