这是我目前的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})
这是从我的源目录构建的,但我必须在之后清理所有额外的文件。我的问题是,如果我的所有源文件都在同一个源目录中,我如何从构建目录构建它?
谢谢
答案 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重新生成。