如何将CMake文件(GLOB SRCS *。)与构建目录一起使用

时间:2016-01-18 20:20:02

标签: cmake

这是我目前的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}) 

这是从我的源目录构建的,但我必须在之后清理所有额外的文件。我的问题是,如果我的所有源文件都在同一个源目录中,我如何从构建目录构建它?

谢谢

3 个答案:

答案 0 :(得分:3)

如果你真的需要使用文件(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})

在这种情况下,每次添加或删除源文件时都必须从构建目录启动cmake:

cmake <your_source_dir> -G <your_build_generator>

菲尔提醒,CMake文档不建议使用GLOB。但也有一些例外。您将获得有关此post的更多信息。

如果你不满足这些例外,你宁可列出你的源文件而不是使用GLOB:

set(SRC_FILES ${PROJECT_SOURCE_DIR}/main.cpp
              ${PROJECT_SOURCE_DIR}/bmi.cpp
              … )

注意:如果.cpp文件中有.h文件的#include,我认为没有理由把它们放在add_executable中,你只需要用include_directories指定include目录。

答案 1 :(得分:3)

如果自上次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()

else()之后的file()命令至少提供了一些向后兼容性:它仍在当前文件夹及其直接子文件夹中搜索源文件。但是它不会自动识别是否有新文件或旧文件已被删除。

请注意,VERSION_GREATER_EQUAL仅在cmake> = 3.7中可用

答案 2 :(得分:-1)

这不是您问题的答案,但我无法在评论中正确格式化。来自cmake documentation

  

注意:我们不建议使用GLOB从源树中收集源文件列表。如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时要求CMake重新生成。