首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake include_directories与GLOB文件

CMake include_directories与GLOB文件
EN

Stack Overflow用户
提问于 2016-02-19 03:34:13
回答 1查看 3K关注 0票数 1

我一直试图将一个项目从VS迁移到CMake,但我不确定我的项目结构是否适合简单的迁移:

代码语言:javascript
复制
project/
|- CMakeLists.txt
|- build/
    |- (cmake stuff)
|- src/
    |- main.cpp
    |- tests.cpp // also contains a main()
    |- class1.hpp
    |- class1.cpp
    |- class2.hpp
    |- class2.cpp
    |- ...
|- included/
    | - (external libs)

到目前为止,我的CMakeLists.txt尝试是:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
set(CMAKE_LEGACY_CYGWIN_WIN32 0)

add_executable(webnectar src/main.cpp
                         src/test.cpp)

enable_testing()
add_test(tests project)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/included)

但是我会把错误和我自己的类联系起来,我不明白为什么。

在其他几个这样的问题中,我看到人们使用文件全局来包含来自子文件夹的所有源,我猜这将是一个解决方案。尽管如此,我还是希望我能理解为什么include_directories是不够的,为什么(如果它能工作的话)文件GLOB是可以的。

而且,使用GLOB文件会给我的构建带来麻烦,因为test.cpp和main.cpp都有一个主要功能。

虽然这看起来是一个不同的问题(对于不同的问题),但请考虑这个问题更一般,因为我如何用CMake语法或更合适的文件结构来解决所有这些问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 04:41:03

  1. 对于目录,该指令对应于-I编译器标志,并允许编译器查找头文件,即包含在#include ...中的头文件。
  2. 您应该在可执行文件的参数中提到所有源文件。那是不可避免的。

您可以使用档案(GLOB.)形成完整的源列表。

代码语言:javascript
复制
FILE(GLOB webnectar_SOURCES RELATIVE src/ *.cpp)

然后在add_executable(webnectar ${webnectar_SOURCES})中使用它。

然而,这并不是最好和最安全的选择,因为它包含一个重大缺陷。文件列表是在构建过程的“配置”阶段(例如cmake -D<....> -D<.....> .)形成的,直到与CMake相关的文件(CMakeLists.txt、CMakeCache.txt等)发生某种改变之前,才会重新构建文件列表。因此,如果您首先运行cmake...,然后添加一个新文件,它将不会被注意到,Makefiles也不会被重新生成。

此外,如果一些额外的文件(例如,在中断的合并后留下)适合掩码,您将得到一些相当意外的结果。

因此,更安全的做法是形成和维护一个明确的资源列表,也就是说,

代码语言:javascript
复制
set(webnectar_SOURCES
  src/main.cpp
  src/class1.cpp
  src/class2.cpp
  ...
)

然后在add_executable(webnectar ${webnectar_SOURCES})中使用它。变量的名称可以是任意的,但是像KDevelop这样的IDE更喜欢标准的命名<artifact>_SOURCES,因此它们可以自动为您提供列表(或者至少尝试维护:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35496836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档