【问题标题】:how to use CMake file (GLOB SRCS *. ) with a build directory如何在构建目录中使用 CMake 文件(GLOB SRCS *.)
【发布时间】:2016-04-24 03:13:35
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 如果您不想将可执行文件与源代码混淆,请使用 out-of-source 构建。你可以说得更详细点吗?您究竟想在构建目录中选择哪些文件(举例)?
  • 另外,你为什么要将 *.h 添加到源列表中?
  • 因为计算 BMI 的程序使用了 main.cpp、bmi.cpp 和 bmi.h 文件,所有这些文件都在源目录中。如果没有 .h 文件,程序将无法运行。我想将这 3 个文件编译成 1 个可执行文件,而不在我的源文件夹中生成所有 cmake 内容。
  • @WillMeyers:这就是为什么您使用源代码之外的构建,以免污染您的源目录。 CMake 自己找出所需的标头。您不需要将它们添加到您的可执行文件中。顺便说一句,使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g "),您的代码将失去用户的额外标志。
  • [33%] 构建 CXX 对象 CMakeFiles/webcam.dir/main.cpp.o /home/devbox/webcam/main.cpp:5:23: error: camera.h: No such file或目录 --devbox@linux-clof:~/webcam> ls --camera.cpp CMakeCache.txt cmake_install.cmake main.cpp camera.h CMakeFiles CMakeLists.txt Makefile 找不到同一目录下的文件!

标签: cmake


【解决方案1】:

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

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

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

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

注意:如果您在 .cpp 文件中包含 .h 文件的#include,我认为没有任何理由将它们放入 add_executable,您只需使用 include_directories 指定包含目录。

【讨论】:

  • 将头文件添加到可执行文件的原因是,在生成 VS 项目(可能还有其他 IDE 的项目?)时,头文件将与相应的 cpp 文件一起出现在源文件列表中。否则,它们将被埋在自动生成的无限“外部依赖项”文件夹中。事实上,当所有项目标题都以这种方式添加时,可以在选项/文本编辑器/C-C++/高级/浏览导航中关闭外部依赖项的可见性。
  • 您现在可以添加使用文件(GLOB … CONFIGURE_DEPENDS …) 来获取对 glob 的更改并在必要时重新运行 cmake 构建。
  • GLOB 早于 3.3
【解决方案2】:

如果 CMakeLists.txt 自上次 cmake 运行后发生更改,或者如果 cmake 用于再次配置项目,则 Cmake 仅用于更新源文件列表。

在 cmake 3.11.0 中添加了递归搜索和自动重新配置添加或删除源文件。从那以后就可以使用下面的sn-p了:

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 中可用

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2015-12-14
    • 2014-07-27
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多