簡體   English   中英

如何在 macOS High Sierra 10.13.6 上使用 Homerew 安裝 llvm@13? 出現“內置目標 lldELF”錯誤

[英]How to install llvm@13 with Homerew on macOS High Sierra 10.13.6? Got "Built target lldELF" error

雖然 Homebrew 不再支持 High Sierra,但我需要安裝llvm@13公式作為其他公式的依賴項。 所以我嘗試以這種方式安裝它:

$ brew install llvm
...
==> Downloading https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0/llvm-project-13.0.0.src.tar.xz
Already downloaded: /Users/username/Library/Caches/Homebrew/downloads/8fd68fc8f968137c5080826db6e58682326235960fd8469363eb27d0799978ca--llvm-project-13.0.0.src.tar.xz
...
==> Installing llvm
==> cmake -G Unix Makefiles .. -DLLVM_ENABLE_PROJECTS=clang;clang-tools-extra;lld;lldb;mlir;polly -DLLVM_ENABLE_RUNTIMES=compiler-rt;libcxx;libcxxabi;libunwind;openmp -DLLVM_POLLY_L
==> cmake --build .
...
[ 79%] Built target lldELF
make: *** [all] Error 2

編譯時間長后出現錯誤。 我還在~/Library/Logs/Homebrew/llvm/02.cmake中發現了這個錯誤:

/tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm:246:52: error: use of undeclared identifier 'CPU_SUBTYPE_ARM64E'
    if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) {
                                                   ^
1 error generated.
make[2]: *** [tools/lldb/source/Host/macosx/objcxx/CMakeFiles/lldbHostMacOSXObjCXX.dir/HostInfoMacOSX.mm.o] Error 1
make[1]: *** [tools/lldb/source/Host/macosx/objcxx/CMakeFiles/lldbHostMacOSXObjCXX.dir/all] Error 2

如何修復該編譯錯誤?

在啟用調試模式的情況下安裝 llvm:

$ brew install --debug llvm

安裝過程遇到問題中提到的相同錯誤,但提供了一些選項來解決問題。 選擇選項 5:

 - raise
 - ignore
 - backtrace
 - irb
 - shell
Choose an action: 5

它使 shell 可以訪問 llvm 公式的當前構建目錄。 查找當前文件夾:

$ pwd
/private/tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src

將位置更改為構建目錄:

cd llvm/build

編輯HostInfoMacOSX.mm並刪除條件的第二部分:

vi ../../lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm

您需要將第 246 行更改為:

    if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) {

至:

    if (cputype == CPU_TYPE_ARM64) {

然后重新運行最后一條命令:

$ cmake --build .

需要一些時間才能完成:

...
[100%] Linking CXX executable ../../../../bin/lldb-vscode
cd /tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src/llvm/build/tools/lldb/tools/lldb-vscode && /usr/local/Cellar/cmake/3.21.4/bin/cmake -E cmake_link_script CMakeFiles/lldb-v
scode.dir/link.txt --verbose=1
/usr/local/Homebrew/Library/Homebrew/shims/mac/super/clang++  -stdlib=libc++ -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wn
o-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-c
lass-memaccess -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wno-deprecated-declarations -Wno-unkn
own-pragmas -Wno-strict-aliasing -Wno-deprecated-register -Wno-vla-extension -O3 -DNDEBUG -Wl,-search_paths_first -Wl,-headerpad_max_install_names  -stdlib=libc++ -Wl,-sectcreate,__
TEXT,__info_plist,/tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src/llvm/build/tools/lldb/tools/lldb-vscode/lldb-vscode-Info.plist  -Wl,-dead_strip CMakeFiles/lldb-vscode.dir/
lldb-vscode.cpp.o CMakeFiles/lldb-vscode.dir/BreakpointBase.cpp.o CMakeFiles/lldb-vscode.dir/ExceptionBreakpoint.cpp.o CMakeFiles/lldb-vscode.dir/FifoFiles.cpp.o CMakeFiles/lldb-vsc
ode.dir/FunctionBreakpoint.cpp.o CMakeFiles/lldb-vscode.dir/IOStream.cpp.o CMakeFiles/lldb-vscode.dir/JSONUtils.cpp.o CMakeFiles/lldb-vscode.dir/LLDBUtils.cpp.o CMakeFiles/lldb-vsco
de.dir/OutputRedirector.cpp.o CMakeFiles/lldb-vscode.dir/ProgressEvent.cpp.o CMakeFiles/lldb-vscode.dir/RunInTerminal.cpp.o CMakeFiles/lldb-vscode.dir/SourceBreakpoint.cpp.o CMakeFi
les/lldb-vscode.dir/VSCode.cpp.o -o ../../../../bin/lldb-vscode  -Wl,-rpath,@loader_path/../lib ../../../../lib/liblldb.13.0.0.dylib -lpthread ../../../../lib/libclang-cpp.dylib ../
../../../lib/libLLVM.dylib
[100%] Built target lldb-vscode
/usr/local/Cellar/cmake/3.21.4/bin/cmake -E cmake_progress_start /tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src/llvm/build/CMakeFiles 0

然后運行安裝命令:

$ cmake --build . --target install

結果的尾部應該是:

...
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/lib/cmake/llvm/./CheckAtomic.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/lib/cmake/llvm/./FindSphinx.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/lib/cmake/llvm/./FindGRPC.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/lib/cmake/llvm/./TableGen.cmake

執行最后一條命令:

$ cmake --build . --target install-xcode-toolchain

結果的尾部應該是:

...
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/Toolchains/LLVM13.0.0.xctoolchain//usr/lib/cmake/llvm/./CheckAtomic.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/Toolchains/LLVM13.0.0.xctoolchain//usr/lib/cmake/llvm/./FindSphinx.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/Toolchains/LLVM13.0.0.xctoolchain//usr/lib/cmake/llvm/./FindGRPC.cmake
-- Installing: /usr/local/Cellar/llvm/13.0.0_1/Toolchains/LLVM13.0.0.xctoolchain//usr/lib/cmake/llvm/./TableGen.cmake
Built target install-xcode-toolchain
/usr/local/Cellar/cmake/3.21.4/bin/cmake -E cmake_progress_start /tmp/llvm-20211109-12151-m0zvtm/llvm-project-13.0.0.src/llvm/build/CMakeFiles 0

然后按control + d返回調試菜單。 因為最后兩個命令是手動運行的,所以您需要通過選擇選項 2 來忽略其余錯誤:

 - raise
 - ignore
 - backtrace
 - irb
 - shell
Choose an action: 2
==> cmake --build . --target install
...
cmake
--build
.
--target
install

Error: could not load cache
BuildError: Failed executing: cmake --build . --target install
1. raise
2. ignore
3. backtrace
4. irb
5. shell
Choose an action: 2
==> cmake --build . --target install-xcode-toolchain
...

cmake
--build
.
--target
install-xcode-toolchain

Error: could not load cache

BuildError: Failed executing: cmake --build . --target install-xcode-toolchain
1. raise
2. ignore
3. backtrace
4. irb
5. shell
Choose an action: 2

它將繼續安裝到其余部分:

==> Fixing /usr/local/Cellar/llvm/13.0.0_1/bin/FileCheck permissions from 755 to 555
==> Fixing /usr/local/Cellar/llvm/13.0.0_1/bin/analyze-build permissions from 755 to 555
...
==> Changing dylib ID of /usr/local/Cellar/llvm/13.0.0_1/lib/libunwind.1.0.dylib
  from @rpath/libunwind.1.dylib
    to /usr/local/opt/llvm/lib/libunwind.1.dylib
/usr/local/Homebrew/Library/Homebrew/brew.rb (Formulary::FromPathLoader): loading /usr/local/opt/llvm/.brew/llvm.rb
==> Caveats
To use the bundled libc++ please add the following LDFLAGS:
  LDFLAGS="-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib"

llvm is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have llvm first in your PATH, run:
  echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc

For compilers to find llvm you may need to set:
  export LDFLAGS="-L/usr/local/opt/llvm/lib"
  export CPPFLAGS="-I/usr/local/opt/llvm/include"

==> Summary
🍺  /usr/local/Cellar/llvm/13.0.0_1: 10,907 files, 1.8GB, built in 1418 minutes 39 seconds

可以這樣驗證,默認預裝了llvm@10

$ /usr/bin/clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

還有新的 Homebrew 版本的llvm@13

$ /usr/local/opt/llvm/bin/clang --version
Homebrew clang version 13.0.0
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin

遵循@Thruston 快捷方式,它對我有用。 感謝您提供我所見過的最詳細的答案,解決了我的確切問題。 很好。 注冊只是為了表示感謝,但我不能投票或將其放在評論中,以評論 Hamid 的回答,這對於該評論的最終結果非常抱歉。

@HamidRohani 為仍在 High Sierra (10.13) 中修修補補的人提供了一個很好的解決方案。 使用較舊的 XCode(在我的情況下為 clang 版本 10.0.1)在我的舊 MAC 上編譯最新版本的 LLVM 是一個很大的幫助。 我名義上的貢獻...

或者,您可以在 HostInfoMacOSX.mm 的第 41 行之后定義符號:

// Kludge: Symbol definition extracted from a modern machine.h
#ifndef CPU_SUBTYPE_ARM64E
#    define CPU_SUBTYPE_ARM64E        ((cpu_subtype_t) 2)
#endif

現在,無需修改第 246 行。定義將解析任何(可能的)后續引用。 讓我匯總上面在 brew 的 debug-shell 中執行的步驟:

cmake . -DLLVM_CREATE_XCODE_TOOLCHAIN=On
cmake --build .
cmake --build . --target install
cmake --build . --target install-xcode-toolchain

關於 LLVM 相關變量,將 LLVM_CREATE_XCODE_TOOLCHAIN 設置為On會指示 CMake 生成名為“install-xcode-toolchain”的目標。 1目標是解決系統完整性保護 (SIP) 問題; “Xcode 工具鏈是一個大部分未記錄的功能,它允許將多個低級工具的副本安裝到不同的位置,並且用戶可以輕松地在它們之間切換。” 2

Brew 的警告Brew 為您提供了使用新編譯器所需的一些警告:“因為 macOS 已經提供了這個軟件,並且並行安裝另一個版本可能會導致各種麻煩。” 要使用您的新編譯器,“您需要首先在 PATH 中擁有 llvm,並且編譯器要找到 llvm,您可能需要設置”LDFLAGS 和 CDFLAGS。 但由於這些智慧寶石出現在接近一百萬行輸出的末尾,讓我在這里重申一下:

export PATH="/usr/local/opt/llvm/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/llvm/lib"
export CPPFLAGS="-I/usr/local/opt/llvm/include"

設置 PATH 很簡單。 然而,我不需要設置 LDFLAGS 或 CPPFLAGS。 此外,這個額外的警告並不令人高興,“要使用捆綁的 libc++,請添加以下 LDFLAGS”:

export LDFLAGS="-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib"

無論如何,繼續……為了證明一切都很好,一個包含 <filesystem>; 的 C++ foo程序; 不在 High Sierra 的圖書館:

#include <iostream>

// C++17: Modern C++ compiler has std filesystem                                                                                            
#include <filesystem>
namespace fs = std::filesystem;
typedef std::filesystem::path my_path;

using namespace std;
int main ()
{
  fs::path path{"/tmp"};
  path /= "foo.txt";

  ofstream ofs(path);
  ofs << "Hello World." << endl;
  ofs.close();

  return 0;
}

顯然,一個無意義的程序,但要編譯:

unset CPPFLAGS
unset LDFLAGS
clang++ -std=c++17  -L/usr/local/opt/llvm/lib  foo.cpp -o foo

再次表明我不需要 CPPFLAGS 和 LDFLAGS。 因此,可執行文件鏈接到正確的 libc++ 庫:

MacIntel:c++fs mjo$ otool -L foo
foo:
    /usr/local/opt/llvm/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)

享受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM