我目前正在使用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.但到目前为止,我找不到合适的变量来测试或任何其他明显的解决方案.
这可能吗?
我使用Homebrew的最新CMake(3.9.3)以及Brew的LLVM 5.0.0,因为Clang在这里有OpenMP支持.
这适用于CMake 3.8.2和LLVM 5.
在我的CMakeLists.txt我
find_package( OpenMP )
Run Code Online (Sandbox Code Playgroud)
后来我想做
if( OpenMP_CXX_FOUND )
Run Code Online (Sandbox Code Playgroud)
然而,CMake似乎没有接受该find_package指令.
我用CMake运行
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON
Run Code Online (Sandbox Code Playgroud)
我已经检查过clang并clang++正确指向/usr/local/opt/llvm/bin/clang和/usr/local/opt/llvm/bin/clang++
我得到的只是这两行:
-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (found version "1.0")
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (found version "1.0")
Run Code Online (Sandbox Code Playgroud)
如果我OpenMP_C_FLAGS自己设置(带-DOpenMP_C_FLAGS=-fopenmp=libomp)它会将错误更改为
-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1")
Run Code Online (Sandbox Code Playgroud)
请注意,它会更改版本号,因此必须找到一些东西,对吗?
我错过了什么才能正常工作?
好吧,似乎在FindOpenMP.cmakeCMake提供的内部我们做了一个try_compile,它默默地失败了(因为我们做了很多次,而且大多数都会失败,这是有道理的).但是,使用Clang时-Werror会提供一个标志,该标志由于未使用的命令行参数而失败.我可以这样补充: …