我安装了Macports GCC编译器,并且我为集成的汇编器安装了Macports Clang:
$ port installed | egrep -i '(gcc|g++|clang)'
clang-3.8 @3.8-r262722_1+analyzer (active)
clang_select @1.0_0 (active)
gcc49 @4.9.3_0 (active)
gcc_select @0.1_8 (active)
libgcc @6.1.0_0 (active)
当我尝试使用集成汇编器编译一个空程序时:
$ cat test.cc
int main(int argc, char* argv[])
{
return argc;
}
它会导致错误:
$ /opt/local//bin/gcc-mp-4.9 -Wa,-q -march=native test.cc -o test.exe
/opt/local/bin/as: assembler (/opt/local/bin/clang) not installed
和:
$ ls /opt/local/bin/clang
ls: /opt/local/bin/clang: No such file or directory
使用集成的汇编程序不仅仅是-Wa,-q
。如果我省略-Wa,-q
,那么真实程序会经历类似于如何在Mac OS上使用AVX/PCLMULQDQ的故障。
如何告诉GCC编译器使用已安装的clang的集成汇编程序?即clang++ -Wa,-q -Wa,as=/opt/local/bin/clang-mp-3.8
,或者,这些东西需要成对安装,而版本编号很重要?即,类似GCC 4.9(2016年1月)之类的东西需要Clang 3.7(2016年1月)?
或,Macports通常将哪些编译器放在/opt/local/bin/clang
?例如,Clang 3.5通常位于/opt/local/bin/clang
为了完整性,此MacBook具有Macports,但没有走路。我将MBP用于OS X测试,第二个角色是Macports测试。但是,我避免将Macports放在路径上以避免张贴OS X测试。
您可以简单地做sudo port select clang mp-clang-3.8
。我不喜欢这样,因为当简单地调用clang
时,它会使默认值为默认值(当然,只有Macports在路径上时)。
我最终要做的是用以下简单脚本替换/opt/local/bin/as
:
#!/bin/sh
clang -c -x assembler $@ -
然后我不将-Wa,-q
参数用于gcc
。
一个人不需要弄乱编译器选项(-wa,-q)即可切换到Clang Integrated Assembler。可以触发相同的行为设置AS_Integrated_assembler环境变量,如我在此处所述。
我很确定版本不需要匹配。但是恐怕Macports必须走上这些工作。更重要的是,恐怕您必须"选择" GCC ...
这是我的设置可行:
$ port select --list clang
Available versions for clang:
apple-clang (active)
mp-clang-3.7
none
uri-clang
$ ll /opt/local/bin/clang
lrwxr-xr-x 1 root admin 14 Jan 21 2015 /opt/local/bin/clang@ -> /usr/bin/clang
$ port select --list gcc
Available versions for gcc:
apple-gcc
mp-gcc6 (active)
none
$ ll /opt/local/bin/gcc
lrwxr-xr-x 1 root admin 23 May 6 17:13 /opt/local/bin/gcc@ -> /opt/local/bin/gcc-mp-6
$ file /opt/local/bin/as
/opt/local/bin/as: Mach-O 64-bit executable x86_64
$ port provides /opt/local/bin/as
/opt/local/bin/as is provided by: cctools
$ $ port dependents cctools
gcc6 depends on cctools
libgcc depends on cctools
$
尝试symlink'ing/usr/bin/clang to/opt/local/bin/clang(对于/usr/bin/bin/clang ),看看它是否有帮助。并确保安装了CCTOOLS端口(尽管我无法想象它不在那里,因为GCC或Clang取决于它)。
和afaik," -wa,-q" 是 告诉GCC使用本机汇编器的方法(至少自XCode-6和GCC-4.8以来,它一直对我有用。