Mac下安装程序出现clang: error unsupported option '-fopenmp'
之前在安装一个工具老是出错,在网上百度了几下,试了几个回答中的解决方法,好像还是不行,后来放了一段时间,今天又抱着试一试的心态再次搜索了一下,竟然搞好了!撒花
错误来源
在Mac下面有时候make
编译程序的时候出现标题中所说的错误,那这个错误是怎么来的呢?
我最开始以为是安装的问题,于是尝试性的就像电脑出问题之后食指去戳开关机键去开机关机一样,关机biu~ - brew uninstall gcc
,然后开机biu~ - brew install gcc
了一下,make
结果仍然如此,头大呀!瞬间想拿起电脑砸了换酒钱的冲动!可是又想起那首歌~,
冲动的惩罚 - 刀强
那一夜我喝醉了,拉起电脑线,胡乱的捶打,只顾着自己心中压抑的想法,狂乱的表达~
哎!砸了东西全没有了啊!全完蛋了!小白无声的怒吼啊!敢怒不敢砸啊!
后来终于在user707650的回答的里面,他说到了可能是在Mac下使用软件管理工具brew
安装的时候并不是指定的gcc
而是clang
,因为报错的信息是来自于clang
而不是gcc
系列的工具,那也就是说电脑默认的编译器是clang
,看了一下gcc
:
$ gcc
clang: error: no input files
$ which gcc
/usr/bin/gcc
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
可以看到gcc
这个名字对应的程序实际上是clang
(这里我似乎明白了点什么,文件/usr/bin/gcc
名字是的确是叫gcc
,而且在bash
里面打gcc
就是这货,但是文件里面的内容好像是clang
的内容,难道这就是Mac设置默认C语言编译器的方法吗?Are you kidding me?),所以在make
编译的时候不是使用的gcc
而是clang
进行的编译。
怎么解决呢?
解决方法
在查了一些资料之后,我总结了几种方法。
上面说过了,出现错误是因为gcc这个名字在你的电脑里面已经不是它自己了,这里我们帮助它做回自己,在编译make
之前,可以导入环境变量到bash里面,改变之前默认的gcc的指向或者指定使用哪个编译器来编译。
在之前,我们需要找到真正的gcc在哪里(如果没有gcc,那么安装gcc,brew install gcc
)
一般brew
下载的gcc
在/usr/local/Cellar
下面,我查看了一下,我的gcc的路径是/usr/local/Cellar/gcc/9.1.0/bin
,里面有这些工具
c++-9
cpp-9
g++-9
gcc-9
...
在安装之后编译后的可执行程序会被复制到/usr/local/bin
下面,查看这个文件夹下的gcc
:
$ ls /usr/local/bin/gcc*
gcc-9
可以看到我的gcc对应的是gcc-9
,于是cd /usr/local/bin/
之后试了一下:
$ gcc-9
gcc-9: fatal error: no input files
compilation terminated.
$ which gcc-9
/usr/local/bin/gcc-9
$ gcc-9 --version
gcc-9 (Homebrew GCC 9.1.0) 9.1.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
这下就是真正的gcc
了,知道了真正的gcc程序在哪里了,就可以有的放矢了,下面介绍了3种方法,你可以尝试其中一种,最推荐的是第2种。
1. 指定使用(方便)
一般在程序的编译文件Makefile
里面,在开头,代码里面会声明几个变量名,比如CC
、CXX
、MPICXX
等等(CC一般是指代gcc
;CXX一般是指代g++
;MPICXX一般是指代mpicxx
),我没有写过Makefile,不知道是怎样的,感觉不像bash
脚本,不管他了,大致明白在干嘛就ok了,我们可以用文本编辑器打开Makefile
,可以看到是用的哪个变量名没,比如用到了CC
,那么在make
的时候直接指定是用什么来make
- 如果Makefile里面是
CC
变量,那么就:
# 直接指定gcc-9来make
$ CC=gcc-9 make
- 如果Makefile里面是
CXX
变量,那么就:
$ CXX=g++-9 make
这里我猜是这样的,
# 这是之前make的方式,等于make是使用gcc来对C语言文件进行的编译,由于gcc这个名字是个“冒名顶替”的,所以真正的是使用clang来make的
$ make
# 后来改为下面这种方式,make并把gcc-9赋值给CC变量
$ CC=gcc-9 make
2. 临时替换(推荐)
上面找到了gcc本身所在的位置,这里临时指定环境变量之后进行编译
# 因为我安装的gcc是9的版本,你自己可以在你的/usr/local/bin下面找对应的gcc
$ export CC=/usr/local/bin/gcc-9
$ export CXX=/usr/local/bin/g++-9
$ export MPICXX=/usr/local/bin/mpicxx-9
然后编译
$ make
3. 长期替换(不推荐)
这里参考了chenxp2311的CSDN博客
有的时候clang
编译会出错,可以将gcc指定的路径放在~/.bash_profile
文件里面,但是这种方法不是很推荐,因为不知道这样长期替换后以后会不会出别的问题。
打开~/.bash_profile
,在里面加上这样几条
alias gcc='gcc-9'
alias cc='gcc-9'
alias g++='g++-9'
alias c++='c++-9'
之后source
生效~/.bash_profile
文件中的设定
$ source ~/.bash_profile
之后再进行编译
$ make
另外...
有时候按照上面做了之后,make
还是出错了,报错信息仍然是clang: error unsupported option '-fopenmp'
这个,说明仍然没有改。我发现在有的Makefile里面不是用变量$(CC)
或者$(CXX)
来指代gcc
的,而是直接用名字,比如g++
、gcc
等等,我们在上面增加环境变量。指定别名之后,我们再试一下which gcc
:
$ which gcc
/usr/bin/gcc
$ $(which gcc)
clang: error: no input files
$ gcc
gcc-9: fatal error: no input files
compilation terminated.
也就是说这个gcc
实际上没有改什么,只是这个名字暂时被用做gcc-9
了。
再来做一件事情,新建一个bash
文件123.sh
vim 123.sh
在里面输入这样的内容:
gcc
a=$(which gcc)
echo $a
运行一下
bash 123.sh
输出为:
clang: error: no input files
/usr/bin/gcc
也就是说上面一顿猛如虎的操作,在bash脚本里面竟然没有用?仍然是这样的!我感觉我快要炸毛了!暴力法吧!捶它!
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
注意:下面的操作每一步要确认好,特别是前面的/usr/bin
文件夹里面的操作,如果不确定,一定要备份一下文件,以免后来出现问题没法还原!!!
# 进入工具的文件夹
$ cd /usr/bin
# 将原本的gcc和g++改名
$ sudo mv gcc gcc-tmp
$ sudo mv g++ g++-tmp
# 添加真正的gcc和g++的环境变量
$ export "PATH=/usr/local/bin:$PATH"
# 建立链接
$ cd /usr/local/bin
$ ln -fs ./gcc-9 ./gcc
$ ln -fs ./g++-9 ./g++
# 测试一下
$ which gcc
/usr/local/bin/gcc
$ $(which gcc)
gcc: fatal error: no input files
compilation terminated.
之后
$ export CC=/usr/bin/gcc
$ export CXX=/usr/bin/g++
$ make
终于好了!!!!!看来还是要暴力一点啊!
但是要记得换回来啊
$ cd /usr/bin
$ sudo mv gcc-tmp gcc
$ sudo mv g++-tmp g++
说明
我对clang
和gcc
还不是很了解,文中说的一些东西比较小白,希望能多多包涵。
如需转载请注明来源 https://www.jianshu.com/p/3ab95219f573
参考
- user707650的回答:Stackpverflow - clang: error: : errorunsupported option '-fopenmp' on Mac OSX El Capitan building XGBoost
- chenxp2311的CSDN博客:CSDN - 将 Mac OS X 系统的 C、C++ 编译器从默认的 Clang 切换到 GCC
- Variables Used by Implicit Rules
- makefile中的$(CXX)是什么