我在一个小型的C ++项目中使用CMake,到目前为止它运行良好......只有一个转折:x
当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测某些源文件被重新编译,导致一个腐败的状态。我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容。
因此,我认为我做错了。
我的项目非常简单有条理:
主目录有:
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
答案 0 :(得分:14)
您应该查看二叉树中的depend.make
个文件。它将在CMakeFiles/target.dir/depend.make
。尝试找到其中一个缺少您认为应该具有的.h
文件的文件。然后为cmake创建一个错误报告或通过电子邮件发送cmake邮件列表。
答案 1 :(得分:9)
我刚刚遇到同样的问题。将include_directories()
中的路径从绝对路径更改为相对路径后,它添加了适当的依赖项。
看起来CMake试图猜测哪些标题是系统,哪些标题与项目相关。我怀疑以/
开头的目录作为-isystem /some/path
传递,因此不会在生成的依赖项中显示。
如果无法用相对路径替换${FOO_SOURCE_DIR}
,可以尝试使用适当的CMake函数计算相对路径。即:
file(RELATIVE_PATH FOO_SOURCE_REL_DIR
${CMAKE_CURRENT_SOURCE_DIR}
${FOO_SOURCE_DIR}/.)
include_directories(${FOO_SOURCE_REL_DIR}/include)
答案 2 :(得分:2)
在将包含添加到cpp文件之前或之后,您是否运行过cmake?
我遇到了这个问题并重新运行cmake修复了它。我添加了包含post-cmake。
答案 3 :(得分:2)
显然cmake从依赖树中删除系统包含路径(感谢@ony提供此提示)。这可能在大多数情况下都有意义,但有时cmake不知道编译器认为是系统路径是什么。我们正在使用忽略/usr/include
的自定义gcc构建,但cmake认为它不会忽略它。要强制cmake使/usr/include
依赖于未优化的依赖项,请尝试以下方法:将/.
添加到路径中。
我试图让所有库依赖项都使用cmake依赖项功能,包括某些“第三方”库,这些库在Linux上默认情况下并不总是安装,甚至可用。例如,Z-lib压缩。
如果Z lib包含在/usr/include
中,但是如果它们不在,则以下接口目标正常工作。
find_package(ZLIB REQUIRED)
message(status "found zlib ${ZLIB_LIBRARIES}")
message(status "found zlib includes ${ZLIB_INCLUDE_DIRS}")
target_link_libraries(zlib_target INTERFACE ${ZLIB_LIBRARIES})
target_include_directories(zlib_target INTERFACE ${ZLIB_INCLUDE_DIRS})
我将最后一行改为
target_include_directories(zlib_target INTERFACE /.${ZLIB_INCLUDE_DIRS})
它有效。现在,依赖于zlib_target
的目标会在编译期间自动获得-I/./usr/include
。