V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

使用 LLVM 的 clang 替换苹果自带的有问题吗

  •  
  •   iqoo · 2023-07-26 19:59:32 +08:00 · 1540 次点击
    这是一个创建于 478 天前的主题,其中的信息可能已经有所发展或是发生改变。

    编译 WebAssembly 时发现 Mac 自带的 clang 编译器无法设置 --target=wasm32 选项,而标准的 clang 可以。

    于是编译了最新的 clang 和 lld 并安装(之前已下载过 LLVM 的 git 仓库,因此直接编译):

    cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_INSTALL_PREFIX=/usr/local ../llvm
    
    make install
    

    安装位置为 /usr/local/bin/clang ,系统默认使用该版本。(原先的 clang 位于 /usr/bin/clang ,只有 160KB 。 真正的 clang 应该位于 /Library/Developer/CommandLineTools/usr/bin/clang ,有 200MB+)

    虽然新版本的 clang 支持 wasm32 选项,但编译出现一大堆问题,所有头文件都找不到了~

    即使编译参数里加上系统自带的头文件路径 -I /Library/Developer/CommandLineTools/SDKs/MacOSX13.0.sdk/usr/include/c++/v1 仍然一堆错误,例如 error: "No thread API"fatal error: 'string.h' file not found 等等。

    或者使用 LLVM 提供的 C 文件 -I llvm-project/libcxx/include 也出现一堆错误。

    这是踩到什么坑了吗?

    9 条回复    2023-07-27 11:18:01 +08:00
    bruce0
        1
    bruce0  
       2023-07-26 20:39:47 +08:00
    mac 上没用过 debian 上的 clang 工具集中 每个工具需要单独安装, clang,llvm, lld 还有 libC++ 这些标准库等等 你这个问题 是不是没有安装 libC++ 库导致的

    mac 上的 clang 和 自己安装的 应该只有版本不同吧, clang 还有多个实现吗
    Nasei
        2
    Nasei  
       2023-07-26 20:52:50 +08:00
    我碰到过,然后直接在 docker 编译解决了,不想在 mac 的环境上浪费时间
    wezzard
        3
    wezzard  
       2023-07-26 21:00:29 +08:00
    CMake 有一组专门使用自定义 C 系列编译器的选项的,叫 CMAKE_CXX_COMPILER 和 CMAKE_C_COMPILER 。我有一个 side project 是自己先 build 一个 toolchain 出来再 build 自己,就是用的这个参数。
    ecnelises
        4
    ecnelises  
       2023-07-26 21:03:39 +08:00
    1. LLVM 在构建的时候可以选择启用哪些 target ,macOS 的 AppleClang 可能只 enable 了 AArch64 和 X86 ,你自己 build 的 Clang 如果不传 LLVM_TARGETS_TO_BUILD 这个 CMake 选项那就是全部启用,也包括 WebAssembly

    2. 苹果的 AppleClang 应该是对 include 和 library path 有一些魔改,你试着编译一个没有#include 的 C 文件然后-v 看就能发现。

    AppleClang 是这样(以 Xcode Beta 为例):
    /usr/local/include
    /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/15.0.0/include
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
    /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)

    社区源码编译的 Clang 是这样:
    /usr/local/include
    ~/Developer/llvm/build/lib/clang/17/include
    /System/Library/Frameworks (framework directory)
    /Library/Frameworks (framework directory)

    最简单的解决方法自然是把 Xcode 里那堆目录软链接到/usr/local/include 里。

    继续尝试编译,发现提示-lSystem 找不到,跟着上面 Xcode Clang 的输出,加上-Wl,-syslibroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk 就可以。

    嫌麻烦也可以把这个额外选项写到 Clang 的 config file 里:

    https://clang.llvm.org/docs/UsersManual.html#configuration-files
    Slurp
        5
    Slurp  
       2023-07-26 22:16:46 +08:00
    不是,你自己编译啥?。。brew install llvm

    ~/.zshrc:

    $BREW_PREFIX 自行替换为 brew --prefix 结果
    export LLVM_HOME="$BREW_PREFIX/opt/llvm"
    export PATH="$LLVM_HOME/bin:$PATH"
    export CC="$LLVM_HOME/bin/clang"
    export CXX="$LLVM_HOME/bin/clang++"

    不就行了
    tool2d
        6
    tool2d  
       2023-07-27 01:27:50 +08:00
    只用 wasi-sdk 的 clang++飘过。

    我看官方对于 thread 之类支持有特殊 hack, 自己编译只能出最最基础的 wasm 吧,什么特殊库都不用,裸奔的那种。
    bosoncat
        7
    bosoncat  
       2023-07-27 09:21:08 +08:00
    为了省事的话,可以直接在这里下载用

    https://github.com/llvm/llvm-project/releases
    ruanimal
        8
    ruanimal  
       2023-07-27 11:13:44 +08:00
    @Slurp 很好奇,为啥很多人安装啥库都编译安装。。
    iqoo
        9
    iqoo  
    OP
       2023-07-27 11:18:01 +08:00
    @Slurp brew 安装一样报这些错误~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2799 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:08 · PVG 12:08 · LAX 20:08 · JFK 23:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.