使用 LLVM 的 clang 替换苹果自带的有问题吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX    LLVM

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

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

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

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

    cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_INSTALL_PREFIX=/usr/loal ../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     Solana     2948 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 13:40 PVG 21:40 LAX 06:40 JFK 09:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86