【发布时间】:2014-12-27 18:24:14
【问题描述】:
我喜欢在多个子目录中构建我的代码,但我不想在每个新子目录中创建一个新的 cmakelist.txt。
我的文件夹结构是这样的:
project
>cmakelist.txt
>build
>src
>main.cpp
>multiple_subdirs_or_(c|h)pp_files_with_more_subdirs_or_(c|h)pp_files
我的 cmakelist.txt 看起来像这样:
...
file(GLOB_RECURSE cpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.cpp")
file(GLOB_RECURSE hpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.hpp")
#remove files with main
list(REMOVE_ITEM cpps "src/test.cpp")
#bins
add_executable(test src/test.cpp src/test.cpp ${hpps} ${cpps})
#same problem if this is used instead of the other add_executable
add_library(foo OBJECT ${cpps} ${hpps})
add_executable(test src/test.cpp $<TARGET_OBJECTS:foo>)
我的文件有问题:
在执行 cmake 后创建的源文件不会被编译,如果使用它们,构建会失败。 正如http://www.cmake.org/cmake/help/v3.0/command/file.html 在 GLOB 部分中预测的那样:
我们不建议使用 GLOB 来收集源文件列表 你的源代码树。如果源是时没有 CMakeLists.txt 文件更改 添加或删除然后生成的构建系统不知道何时 要求 CMake 重新生成。
问题:是否可以将单个 cmakelist.txt 用于具有多个子目录的项目? (没有文件问题(GLOB ...))
【问题讨论】:
-
您可以运行目标
make rebuild_cache以使 cmake 再次运行 globbing 表达式,它会选择新文件 - 但正如其他人在答案中建议的那样,最好手动列出所有文件(这意味着您还必须在 CMakeLists.txt 中添加新文件,并且当文件更改时,cmake 会自动重新构建缓存)。
标签: cmake