在Mac OSX上使用动态链接编译C++与OpenMP

qvsjd97n  于 12个月前  发布在  Mac
关注(0)|答案(1)|浏览(196)

摘要

如何在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实际上尝试了这个标志,但没有识别为工作。任何想法为什么,或者如何解决这个问题?

omjgkv6w

omjgkv6w1#

是的,如果你想将它们与应用程序捆绑在一起,有必要更改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()

字符串

相关问题