在配置OpenMP的过程中,再一次体现了Mac相对于Linux而言,环境不是很友好。整个配置花了将近三个小时,非常不开心。
先说一下最终方案:
方案一:不用clang
如果不用MacOS 默认的Clang(Mac默认把gcc重定向到Clang),那么就需要安装GNU的compiler,其中默认支持openmp(libgomp.so)。我电脑里面真正的gcc在/usr/local/bin/gcc-9,在zsh里面,用alias把gcc命令重定向到这个地方来。
然后如果不用cmake,则万事大吉,编译的时候直接加-fopenmp就可以,非常简单。
如果用cmake,则需要设置
set(CMAKE_C_COMPILER "/usr/local/bin/gcc-9")
同样也可以在cmake cmd的时候加上-DCMAKE_C_COMPILER=/usr/local/bin/gcc-9。测试发现如果在cmakelist里面加,则vscode的cmake tools要build好久,电脑呼呼响。
同时手动加上compile-time flag
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -fopenmp")
然后还需要手动加上头文件地址
include_directories("/usr/local/Cellar/gcc/9.3.0_1/lib/gcc/9/gcc/x86_64-apple-darwin19/9.3.0/include/")
非常脏
方案二:用clang
OpenMP on High Sierra - 这个post讲得非常清楚了。(如果homebrew需要更新不了,直接把homebrew删了,即到安装路径下删除,到homebrew官网重新安装)
然后说一下没有结果的几个方案:
- 把真实gcc的位置放到环境变量CC与CXX里面,事实证明没有卵用,CMake根本不理;(好像重启电脑或者重启vscode,vscode会重读.zshrc里面的内容。)
附上gcc openmp的文档
附上判断当前cmake使用编译器的cmake命令
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
MESSAGE("Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
MESSAGE("GNU")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
MESSAGE("Intel")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
MESSAGE("MSVC")
endif()