【问题标题】:MacPorts GCC compiler, -Wa,-q and "(/opt/local/bin/clang) not installed"MacPorts GCC 编译器、-Wa、-q 和“未安装 (/opt/local/bin/clang)”
【发布时间】:2016-06-16 09:58:56
【问题描述】:

我安装了 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,那么真正的程序会遇到类似于How to use AVX/pclmulqdq on Mac OS X 的故障。

如何告诉 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 测试。

【问题讨论】:

    标签: macos gcc assembly macports


    【解决方案1】:

    你可以简单地做sudo port select clang mp-clang-3.8。我不喜欢这个,因为它在简单地调用clang 时将其设为默认值(当然,仅当 MacPorts 在 PATH 上时)。

    我最终做的是用以下简单脚本替换/opt/local/bin/as

    #!/bin/sh 
    clang -c -x assembler $@ - 
    

    然后我不使用-Wa,-q 参数到gcc

    【讨论】:

    • 哦,好主意。我的下一个想法是我不想避免-Wa,-q,因为我们想测试它。我们在“MacPorts/GCC with Clang/Assembler”配置中有用户,我们最近took a related bug report。那么,我们可以使用你的聪明技巧使用-Wa,-q吗?
    • 嗯,当然。你可以做sudo port select clang mp-clang-3.8 用脚本替换/opt/local/bin/as。如果你通过-Wa,-q,那么gcc会直接调用clang汇编器,没有它会调用as,指的是clang。该脚本让您可以更好地控制调用哪个clang,例如,您可以明确输入/usr/bin/clang
    • 另外,仅供参考,有一个更花哨的脚本可以替换 as 周围的 here。但上面的简单版本为我做到了。
    【解决方案2】:

    不需要为了切换到 clang 集成汇编器而弄乱编译器选项 (-Wa,-q)。正如我在here 中解释的那样,设置 AS_INTEGRATED_ASSEMBLER 环境变量可以触发相同的行为。

    【讨论】:

      【解决方案3】:

      我很确定版本不需要匹配。但我担心 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
      $
      

      尝试将 /usr/bin/clang 符号链接到 /opt/local/bin/clang(与 /usr/bin/clang++ 相同),看看是否有帮助。并确保已安装 cctools 端口(尽管我无法想象它不存在,因为 gcc 或 clang 都依赖于它)。

      而且 AFAIK,“-Wa,-q”告诉 GCC 使用本机汇编程序的方式(至少自 Xcode-6 和 GCC-4.8 以来它一直为我工作)。

      【讨论】:

      • 但是您可以为一个测试设置 PATH,并为下一个测试更改它?
      • 唉,我不知道。有人可能推测,如果port 可执行文件驻留在/opt/local/bin 中,那么/opt/local 可能就是您的Macports 安装目录。但这可能不是万无一失的。 :-(
      猜你喜欢
      • 2011-09-03
      • 2019-10-02
      • 2013-12-27
      • 1970-01-01
      • 2022-11-10
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多