这是我目前的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.3)
set(CMAKE_C_FLAGS " -Wall -g ")
project( bmi )
file( GLOB SRCS *.cpp *.h )
add_executable( bmi ${SRCS})
Run Code Online (Sandbox Code Playgroud)
这是从我的源目录构建的,但是我必须在之后清理所有额外的文件.我的问题是,如果我的所有源文件都在同一个源目录中,我如何从构建目录构建它?
谢谢
小智 11
如果自上次 cmake 运行以来 CMakeLists.txt 发生更改或使用 cmake 再次配置项目,则 Cmake 仅更新源文件列表。
在 cmake 3.11.0 中,添加了添加或删除源文件时的递归搜索和自动重新配置。从那时起,您可以使用以下代码片段:
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.11.0")
file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS *.cpp *.h)
else()
file(GLOB SOURCE_FILES *.cpp *.h */*.h */*.cpp)
endif()
Run Code Online (Sandbox Code Playgroud)
else() 之后的 file() 命令至少提供了一点向后兼容性:它仍然在当前文件夹及其直接子文件夹中搜索源文件。但它不会自动识别是否有新文件或旧文件已被删除。
请注意,VERSION_GREATER_EQUAL 仅在 cmake >= 3.7 中可用
如果您确实需要使用file(GLOB…),则此CMakeLists.txt应该可以工作:
cmake_minimum_required(VERSION 3.3)
project(bmi)
add_definitions("-Wall" "-g")
include_directories(${PROJECT_SOURCE_DIR})
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
add_executable(bmi ${SRC_FILES})
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每次添加或删除源文件时,都必须从构建目录中启动cmake:
cmake <your_source_dir> -G <your_build_generator>
Run Code Online (Sandbox Code Playgroud)
正如Phil提醒的那样,CMake文档不建议这种GLOB用法。但是也有一些例外。您将获得有关此帖子的更多信息。
如果您不符合这些例外,则宁愿列出您的源文件,也不愿使用GLOB:
set(SRC_FILES ${PROJECT_SOURCE_DIR}/main.cpp
${PROJECT_SOURCE_DIR}/bmi.cpp
… )
Run Code Online (Sandbox Code Playgroud)
注意:如果您在.cpp文件中包含#h个.h文件,则没有任何理由将它们放入add_executable中,您只需要指定包含include_directories的目录即可。
归档时间: |
|
查看次数: |
31096 次 |
最近记录: |