如何以便携方式在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尝试的,但不被认为是有效的。知道为什么或如何解决这个问题?
答案 0 :(得分:0)
是的,如果要将它们与应用程序捆绑在一起,则有必要更改dylib的位置。请注意,您不会“修改这两个库”,而只会“在可执行文件内部中查找它们的查找路径。”
关于第二点(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()