gpt4 book ai didi

CMake add_subdirectory 和重新编译

转载 作者:行者123 更新时间:2023-12-01 13:35:40 33 4
gpt4 key购买 nike

我刚刚将一个较大的项目从 Visual Studio 解决方案迁移到 CMake,我注意到一个奇怪的行为。我有类似以下结构的东西:

project/CMakeLists.txt
project/code/CMakeLists.txt

project/code/library-1/CMakeLists.txt
project/code/library-1/*.hpp
project/code/library-1/*.cpp
project/code/library-2/CMakeLists.txt
project/code/library-2/*.hpp
project/code/library-2/*.cpp
...
project/code/library-n/CMakeLists.txt
project/code/library-n/*.hpp
project/code/library-n/*.cpp

project/demo/CMakeLists.txt
project/demo/demo-1/CMakeLists.txt
project/demo/demo-1/*.hpp
project/demo/demo-1/*.cpp
project/demo/demo-2/CMakeLists.txt
project/demo/demo-2/*.hpp
project/demo/demo-2/*.cpp
...
project/demo/demo-n/CMakeLists.txt
project/demo/demo-n/*.hpp
project/demo/demo-n/*.cpp
  1. CMakeLists.txt 文件配置编译标志、宏定义等,并使用 CMake 的 add_subdirectory() 包含库和演示项目定义的目标。
  2. code 子文件夹包含一个子文件夹的平面列表,每个子文件夹都包含静态库的源代码(以及在 CMakeLists.txt 中定义的目标) > 文件)。
  3. demo 子文件夹包含子文件夹的平面列表。每个都包含一个可执行文件和相关的 CMakeLists.txt 文件的源代码。
  4. 每个库都是一个独立的组件,并且独立于所有其他库和演示项目进行构建。
  5. 每个演示程序都依赖于 code 子文件夹中的一个或多个不同的库。

这个设置真的很好。如果我想更改构建选项,我只需要修改根 CMakeLists.txt 并使用新设置重新编译所有内容。如果我在树中的任何位置修改任何源代码,相应的库(如果有)都会重新编译,并且所有相关的演示程序也会重新构建。

但是,如果我在树中的任何位置修改 any CMakeLists.txt 文件,则会重新编译整个库和程序树而不考虑依赖关系。为了说明我的意思,这里是 CMake 构建脚本的几个部分。


project/demo/CMakeLists.txt

# Resolve libraries built in `code` sub-folder.
link_directories(${LIBRARY_OUTPUT_PATH})

set(demo-projects
demo-1
demo-2
...
demo-n
)
foreach(demo-project ${demo-projects})
add_subdirectory(${demo-project})
endforeach()

project/demo/demo-n/CMakeLists.txt

# Find all source code in the same folder.
file(GLOB ${demo-project}_headers
${CMAKE_CURRENT_SOURCE_DIR}/*.hpp
)
file(GLOB ${demo-project}_sources
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)

# Select libraries to link with.
set(${demo-project}_libraries
library-1
library-2
library-5
)

# Build the demo program.
add_executable(${demo-project}
${${demo-project}_headers}
${${demo-project}_sources}
)
if(${demo-project}_libraries)
target_link_libraries(${demo-project} ${${demo-project}_libraries})
endif()

# Manually register some dependencies on other targets.
if(${demo-project}_dependencies)
add_dependencies(${demo-project} ${${demo-project}_dependencies})
endif()

如果我碰巧修改 project/demo/demo-n/CMakeLists.txt 以添加额外的库,如下所示:

set(${demo-project}_libraries
library-1
library-2
library-5
library-6
)

然后重新编译项目中所有库和演示程序的整个源代码。为什么会这样?有没有更好的方法来构建我的脚本以避免这种情况?

最佳答案

您要做的第一件事是弄清楚发生了什么变化。如果你安装了 git,你可以使用它来帮助你做到这一点。

  1. 在您的项目上运行 cmake 并使用源代码构建
  2. cd 到构建目录
  3. 从构建树中创建一个 git repo混帐添加。git commit -m "添加构建树"
  4. 更改导致重建的 cmakefile
  5. 在构建树上重新运行 cmake制作。
  6. 运行 git diff 看看有什么变化。

关于CMake add_subdirectory 和重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479929/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com