我一直在尝试将项目从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>
答案 0 :(得分:2)
-I
编译器标志,允许编译器查找 header 文件,即#include ...
中包含的文件。您可以使用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
,因此他们可以为您自动保留列表(或者至少尝试维护:))