如何在 Mac OSX 上使用 OpenMP 以可移植的方式编译 C++ 代码?
有许多来源建议在 OSX 上使用 OpenMP 编译 C++ 的解决方案,例如:他们中的大多数人建议安装更新的 LLVM/Clang(或 GCC)而不是默认的 Clang。在 OSX 10.12.6 (Sierra) 上,使用 LLVM(通过
brew install llvm
)适合我。但是,生成的二进制文件似乎不可移植。如果可能的话,我想提供一个二进制文件,这样我的用户就不必自己编译。
这是我尝试过的
otool -L my_binary
产量
/usr/local/opt/llvm/lib/libomp.dylib (compatibility version 5.0.0, current version 5.0.0)
/usr/local/opt/llvm/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
/usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 307.2.0)
前两行看起来我不能将二进制文件交给某个用户并期望它能够工作。用户必须首先安装 LLVM。
所以,我发现
install_name_tool
能够改变这一点。请参阅https://blogs.oracle.com/dipol/dynamic-libraries,-rpath,-and-mac-os 于是我就跑了
cp /usr/local/opt/llvm/lib/libomp.dylib .
cp /usr/local/opt/llvm/lib/libc++.1.dylib .
install_name_tool -change /usr/local/opt/llvm/lib/libomp.dylib @executable_path/libomp.dylib my_binary
install_name_tool -change /usr/local/opt/llvm/lib/libc++.1.dylib @executable_path/libc++.1.dylib my_binary
install_name_tool -id "@loader_path/libomp.dylib" libomp.dylib
install_name_tool -id "@loader_path/libc++.1.dylib" libc++.1.dylib
不幸的是,我没有另一台 Mac 来测试这个。所以,我什至不知道这是否有效。
问题
另外一个小问题:CMake 找不到 OpenMP(使用
find_package
),因此我必须对所需的标志进行硬编码 (
-fopenmp=libomp
)。该标志实际上由 CMake 尝试过,但未被识别为有效。知道为什么,或者如何解决这个问题吗?
在可执行文件中。
关于第二点(CMake 未找到 OpenMP):这应该使用较新版本的 cmake (>=3.12) 来解决。在我的系统(OSX 10.13)上,CMakeLists.txt 中的以下条目可以解决问题:
find_package(OpenMP)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
if (APPLE)
target_link_libraries(my_target OpenMP::OpenMP_CXX)
else ()
target_link_libraries(my_target)
endif()
谢谢,
简书