c++ - 使用 cmake 处理头文件依赖项

标签 c++ dependencies cmake header-files

我在一个小型 C++ 项目上使用 CMake,到目前为止它运行良好...有一个转折:x

当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它的源文件),但是 cmake 似乎只检测到 一些 源文件以被重新编译,导致损坏状态。我可以通过清除项目并从头开始重建来解决这个问题,但这绕过了使用 make 实用程序的目标:只重新编译需要的东西。

因此,我想我做错了什么。

我的项目组织得非常简单:

  • 所有资源所在的顶级目录,主 CMakeLists.txt 就在那里
  • 所有公共(public) header 所在的“包含”目录(在各种子目录中)
  • 源文件的所有子目录都在其中的“src”目录,src CMakeLists.txt 就在那里
  • “src”目录中每个子目录的 CMakeLists.txt

主目录有:

cmake_minimum_required(VERSION 2.8)

project(FOO)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

# Compiler Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++0x -Wall -Wextra -Werror")

include_directories($(FOO_SOURCE_DIR)/include)

add_subdirectory(src)

“src”目录:

add_subdirectory(sub1)
add_subdirectory(sub2)
add_subdirectory(sub3)
add_subdirectory(sub4)

add_executable(foo main.cpp)

target_link_libraries(foo sub1 sub2 sub3 sub4)

其中 sub4 取决于 sub3 取决于 sub2 取决于 sub1

还有一个子目录的例子(sub3):

set(SUB3_SRCS
    File1.cpp
    File2.cpp
    File3.cpp
    File4.cpp
    File5.cpp
    File6.cpp
    )

add_library(sub3 ${SUB3_SRCS})

target_link_libraries(sub3 sub1 sub2)

如果有人能指出我的错误,我会很高兴,在这里或在 CMake 上搜索没有产生任何结果,所以我想这很容易或者应该开箱即用......

(供引用,我在MSYS上使用的是cmake 2.8.2版)

编辑:

感谢Bill 的建议,我检查了CMake 生成的depend.make 文件,确实缺少(严重)。这是一个例子:

src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp

是的,就是这样,根本没有引用任何包含:x

最佳答案

您应该查看二叉树中的 depend.make 文件。它将位于 CMakeFiles/target.dir/depend.make 中。尝试找到其中一个缺少您认为应该具有的 .h 文件的文件。然后为 cmake 创建错误报告或通过电子邮件发送 cmake 邮件列表。

关于c++ - 使用 cmake 处理头文件依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7461000/

相关文章:

c++ - 使用带有 cmake 的 OpenGL ES 2.0 生成 iOS 静态库

c++ - CLion、Windows 10 上的 libigl、GLEW、GLFW 和 Eigen。链接器错误

cmake - 如何在Chrome原生客户端中运行测试用例?

c++ - 我需要从示例 MPEG-TS 文件中获取 PIDS

c++ - 为什么在 std::move 到抛出函数后成员 unique_ptr<> 保持非空?

dependencies - 删除 React 中未使用的依赖项

c++ - 如何处理必须按特定顺序调用的公共(public)函数的依赖项?

c# - 类型库 'System_Windows_Forms' 是从 CLR 程序集导出的,不能作为 CLR 程序集重新导入

c++ - Boost beast 在接受期间操纵 http 响应 header

c++ - 沿 4 字节边界对齐