我正在一个小的C++项目中使用CMake,目前它运行得很好...只有一个问题 :x
当我更改一个头文件时,通常需要重新编译一些源文件(直接或间接包含它的那些文件),但似乎cmake只检测到某些需要重新编译的源文件,导致状态不正确。我可以通过清除该项目并从头开始重建来解决此问题,但这违反了使用make实用程序的目标:只重新编译所需内容。
因此,我想我做错了什么。
我的项目非常简单:
- 一个顶级目录,其中包含所有资源,主CMakeLists.txt位于其中
- 一个“include”目录,其中包含所有公共头文件(在各种子目录中)
- 一个“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
,而 sub3
又依赖于 sub2
,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
set(SUB3_SRCS …)
中列出头文件吗?我总是这样做,而且从未遇到过任何类似的问题。 - emlai