C++ CMake、UnitBuild特定编译选项
我有一个文件夹结构的项目:C++ CMake、UnitBuild特定编译选项,c++,cmake,C++,Cmake,我有一个文件夹结构的项目: ProjectRoot/ ProjectRoot/Folder1 ProjectRoot/Folder2 当前,位于ProjectRoot中的我的Cmake文件如下所示 #I'm not proficient with Cmake, so I force recent version to prevent me debuggin #problems for users that use old Cmake versions. cmake_minimum_requi
ProjectRoot/
ProjectRoot/Folder1
ProjectRoot/Folder2
当前,位于ProjectRoot中的我的Cmake文件如下所示
#I'm not proficient with Cmake, so I force recent version to prevent me debuggin
#problems for users that use old Cmake versions.
cmake_minimum_required( VERSION 2.8)
project( Project)
add_definitions( -DPROJECT_BUILD_DLL)
if(MINGW)
add_compile_options( -Os -Wall -Wextra)
endif()
add_subdirectory( ProjectRoot/Folder1)
add_subdirectory( ProjectRoot/Folder2)
add_library( libProject SHARED $<TARGET_OBJECTS:ProjectRootObj>
$<TARGET_OBJECTS:ProjectRootFolder1Obj>)
构建成功。然而,我有一个棘手的问题,在子文件夹中设置的编译器选项被应用于“项目范围”(来自每个CMakeLists.txt文件的选项也被“添加”到其他文件中!)
Folder2中的源代码是一个自动生成的OpenGL源文件(GLLoadGen),因此我希望它在编译时不使用编译选项(从另一个CMakeLists.txt文件在另一个文件夹中设置):
因为它正在生成数百个警告。无论我添加子文件夹的顺序如何,似乎“编译器选项”都应用于整个项目,这意味着如果我编译
文件夹1与
-O1
文件夹2与
-O2
通过查看生成的Makefiles,我看到“-O1”和“-O2”都被应用为两个文件夹的命令行选项!相反,我想对每个文件夹使用不同的编译选项,因为每个文件夹都是不同的编译单元,需要不同的警告和优化级别
这对我来说似乎是一个Cmake问题,因为我遵循了他们关于对象目标的教程,其中特别指出“为每个对象使用不同的编译器选项”。那么我错过了什么
学分:
- 我总是在我的项目中使用unity builds,我现在使用Cmake来自动生成“all.cpp”(我以前使用bash脚本实现了这一点),使用本页的教程:
#options seen by subfolders
if(MINGW)
add_compile_options( -Os -Wall -Wextra)
endif()
add_subdirectory( ProjectRoot/Folder1)
add_subdirectory( ProjectRoot/Folder2)
#options seen only by current target (if any file compiled here)
if(MINGW)
add_compile_options( -Wzero-as-null-pointer-constant
-Wold-style-cast)
endif()
问题是,一些文件夹是由CMakeLists.txt添加的,它的“add\u compile\u options”位于错误的位置
基本上我的解决方案/建议是:避免递归添加CMakeLists.txt
使用根目录“CMakeLists.txt”,并包含其中的所有子文件夹。这使项目保持了很多
更简单(当添加新文件夹时,您有一个地方可以编辑,而不是查找N个要编辑的文件以包含其“子文件”)
-O2
#options seen by subfolders
if(MINGW)
add_compile_options( -Os -Wall -Wextra)
endif()
add_subdirectory( ProjectRoot/Folder1)
add_subdirectory( ProjectRoot/Folder2)
#options seen only by current target (if any file compiled here)
if(MINGW)
add_compile_options( -Wzero-as-null-pointer-constant
-Wold-style-cast)
endif()