我一直试图将一个项目从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)但是我会把错误和我自己的类联系起来,我不明白为什么。
在其他几个这样的问题中,我看到人们使用文件全局来包含来自子文件夹的所有源,我猜这将是一个解决方案。尽管如此,我还是希望我能理解为什么include_directories是不够的,为什么(如果它能工作的话)文件GLOB是可以的。
而且,使用GLOB文件会给我的构建带来麻烦,因为test.cpp和main.cpp都有一个主要功能。
虽然这看起来是一个不同的问题(对于不同的问题),但请考虑这个问题更一般,因为我如何用CMake语法或更合适的文件结构来解决所有这些问题。
发布于 2016-02-19 04:41:03
您可以使用档案(GLOB.)形成完整的源列表。
FILE(GLOB webnectar_SOURCES RELATIVE src/ *.cpp)然后在add_executable(webnectar ${webnectar_SOURCES})中使用它。
然而,这并不是最好和最安全的选择,因为它包含一个重大缺陷。文件列表是在构建过程的“配置”阶段(例如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,因此它们可以自动为您提供列表(或者至少尝试维护:)
https://stackoverflow.com/questions/35496836
复制相似问题