我目前正在使用cmake来构建一些项目,主要平台是Visual C++,MinGW GCC和Linux GCC.使用GCC构建时,我需要指定-Wno-invalid-offsetof编译器选项.
我目前的修复方法如下......
if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio"
OR "${CMAKE_GENERATOR}" MATCHES "^NMake"
)
set (CPPLIB_COMPILER_OPTS "")
else ()
set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof")
endif ()
...
set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}")
# repeated for all targets
Run Code Online (Sandbox Code Playgroud)
这是有效的,但假设除了视觉工作室之外的所有生成器都将使用gcc构建,这显然是不安全的.首先,Borland编译器有IIRC发生器.更重要的是,使用make并不总是意味着使用gcc.
我可能使用的其他编译器是llvm-gcc和clang.幸运的是,我认为即使是clang也支持gcc兼容的选项.但只要相关代码永远不会发布,这种逻辑才有用.
Cmake似乎检查了可用的编译器,并专门为该编译器生成一个makefile(提出问题 - 为什么不至少可以选择直接构建项目,而不需要像make这样的中间人?).
既然如此,我希望能够在我的CMakeLists.txt文件中直接测试gcc.但到目前为止,我找不到合适的变量来测试或任何其他明显的解决方案.
这可能吗?
ric*_*chq 36
要创建可移植的构建系统,最好不要测试平台,而是测试功能.
而不是测试"如果Windows然后这样做",测试"如果-Wno-invalid-offsetof标志工作,然后使用它".您可以使用CheckCCompilerFlag模块执行此操作,例如:
include(CheckCCompilerFlag)
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF)
if (HAS_NO_INVALID_OFFSETOF)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof")
endif()
Run Code Online (Sandbox Code Playgroud)
对于C++,有一个类似的CheckCXXCompilerFlag带有一个check_cxx_compiler_flag(flag var)命令.
| 归档时间: |
|
| 查看次数: |
6260 次 |
| 最近记录: |