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

问题描述 投票:0回答:2

总结

如何在 Mac OSX 上使用 OpenMP 以可移植的方式编译 C++ 代码?

有许多来源建议在 OSX 上使用 OpenMP 编译 C++ 的解决方案,例如:

  • OSX 10.11 上的 OpenMP 支持
  • apple clang -fopenmp 不工作
  • openmp 在我的 Mac 上运行单线程
他们中的大多数人建议安装更新的 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 尝试过,但未被识别为有效。知道为什么,或者如何解决这个问题吗?

c++ macos openmp dylib
2个回答
1
投票
是的,如果您想将它们与应用程序捆绑在一起,则需要更改可执行文件中的 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()
    

0
投票
我认为 install_name_tool 链接不再可用。知道我在哪里可以找到它吗?我还想将 libomp 与我的二进制文件(也称为静态链接)捆绑在一起。

谢谢,

简书

© www.soinside.com 2019 - 2024. All rights reserved.