如何在OS X中包含omp.h
How to include omp.h in OS X?
我是C语言的新手,在OS X中编译代码时遇到了一些问题。
我在Eclipse中编写了很多Java代码,并使用终端来编译我的代码。然而,现在我正在学习openMP,并遇到了麻烦。
首先,我下载了Xcode来编写openMP代码,但它无法识别<omp.h>
。然后我安装了g++
。当我在终端中键入g++ -v
时,我得到的是:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
但当我使用g++ Mesh.cpp -fopenmp
时,我仍然会得到
Mesh.cpp:4:10: fatal error: 'omp.h' file not found
#include <omp.h>
^
1 error generated.
然后我尝试将PTP安装到我的Eclipse中,却遇到了同样的问题。我以为我的MacBook中没有omp.h
,所以我搜索了一下,在gcc-4.9.1/build/
下的文件夹下找到了几个omp.h
。
问题来了。根据Java的经验,我有这个文件但不能使用它的唯一原因是类路径错误。然而,我不知道如何在g++、Xcode或Eclipse中更改此配置。但是,既然我可以包含像<stdio.h>
这样的文件,并用所有IDE编译它,我怎么不能用<omp.h>
做同样的事情呢?
我注意到的另一件事是,gcc文件夹的版本是4.9.1
,但当我在终端中键入gcc -v
时,我在g++ -v
中键入的内容相同
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
版本信息不应该说明4.9.1
吗?就像java -version
显示一样
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
感谢阅读。感谢您的帮助。
此命令可以帮助您
brew安装libomp
brew info libomp
libomp: stable 6.0.1 (bottled)
LLVM's OpenMP runtime library
https://openmp.llvm.org/
/usr/local/Cellar/libomp/6.0.1 (12 files, 1.2MB) *
Poured from bottle on 2018-11-20 at 16:12:22
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/libomp.rb
==> Dependencies
Build: cmake ✘
==> Requirements
Required: macOS >= 10.10 ✔
==> Caveats
On Apple Clang, you need to add several options to use OpenMP's front end
instead of the standard driver option. This usually looks like
-Xpreprocessor -fopenmp -lomp
You might need to make sure the lib and include directories are discoverable
if /usr/local is not searched:
-L/usr/local/opt/libomp/lib -I/usr/local/opt/libomp/include
For CMake, the following flags will cause the OpenMP::OpenMP_CXX target to
be set up correctly:
-DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I/usr/local/opt/libomp/include" -DOpenMP_CXX_LIB_NAMES="omp" -DOpenMP_omp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib
MacOS似乎包含了该库,但如果您只使用,XCode找不到它
#include <omp.h>
然而,如果你没有安装库,你可以简单地通过安装HomeBrew:来添加它
brew install libomp
完成此操作后,只需将库包含代码替换为以下代码:
#include "/usr/local/opt/libomp/include/omp.h"
或者终端在使用brew安装libomp后显示的路径。
GCC 4.9.1通常不随OS X一起发货(实际上,GCC不再随Xcode一起发货)。您的必须通过其他方式安装,例如Homebrew或此处所述的自编译。您可能缺少的是正确设置PATH
变量,或者额外安装的编译器具有版本后缀的二进制文件,即gcc-4.9
或g++-4.9
,而不是简单的gcc
/g++
。
正如@ruenvb已经提到的,苹果用类似GCC的名称符号链接Clang可执行文件。我个人认为这是一种糟糕的做法,因为Xcode附带的最近的Clang版本会对未识别的命令行选项(例如GCC前端特定的选项)产生严重错误。
gcc
和g++
命令与XCode不同:苹果公司认为将Clang伪装成GCC是一个好主意,可以使转换更顺利。
Clang OpenMP支持仍在进行中。如果我没有错过WIP代码的任何重大发布,你需要构建这个版本的Clang并使用它。
当然,你可以通过自制软件或macports之类的东西安装真正的GCC,这将附带OpenMP支持。
omp.h
文件已移动到一个子目录中。我在MacPorts中找到了它,并通过创建一个指向该文件的链接解决了这个编译问题:
sudo ln -s /opt/local/include/libomp/omp.h /opt/local/include/omp.h
如果您使用M1芯片
brew在此安装libomp /opt/homebrew/Cellar/
所以你必须手动链接libomp,在我安装了brew install libomp
之后,我得到了libomp 14.0.0
所以使用以下命令可能会帮助您
g++ -Xpreprocessor -fopenmp -I/opt/homebrew/Cellar/libomp/14.0.0/include -L/usr/local/lib -lomp *.cpp -o main
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 错误:"num_thread"之前应包含"#pragma OMP"子句
- 如何在OS X中包含omp.h
- 如何在不指定确切路径的情况下在OS X上包含"omp.h"