Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake、UnitBuild特定编译选项_C++_Cmake - Fatal编程技术网

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()