CMake include_directories与文件GLOB

时间:2016-02-19 03:34:14

标签: cmake

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

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尝试是:

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)

但我将错误与我自己的课程联系起来。我不明白为什么。

在其他几个SO问题中,我看到人们使用文件GLOB来包含子文件夹中的所有源代码,我想这将是一个解决方案。尽管如此,我希望我理解为什么include_directories是不够的以及为什么(如果它可行)文件GLOB是可以的。

另外,使用文件GLOB会搞乱我的构建,因为test.cpp和main.cpp都有一个main函数。

虽然它看起来像是另一回事(针对不同的问题),但请将此问题视为更一般的问题,即如何使用CMake语法或更合适的文件结构解决所有这些问题。< / p>

1 个答案:

答案 0 :(得分:2)

  1. 关于include_directories该指令对应-I编译器标志,允许编译器查找 header 文件,即#include ...中包含的文件。
  2. 您应该在add_executable的参数中提及所有源文件。这是不可避免的。
  3. 您可以使用FILE(GLOB..)形成完整的来源列表:

    FILE(GLOB webnectar_SOURCES RELATIVE src/ *.cpp)
    

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

    然而,这不是最好和最安全的选择,因为它包含一个重大缺陷。文件列表是在&#34;配置&#34;期间形成的。构建过程的阶段(例如cmake -D<....> -D<.....> .)然后它永远不会重建,直到CMake相关文件(CMakeLists.txt,CMakeCache.txt等)以某种方式改变。因此,如果您首先运行cmake...然后添加新文件,则不会被注意到,并且Makefiles不会被重新生成。

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

    因此,形成和维护明确的来源列表更安全,即

    set(webnectar_SOURCES
      src/main.cpp
      src/class1.cpp
      src/class2.cpp
      ...
    )
    

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