【发布时间】:2019-04-10 13:40:42
【问题描述】:
使用Dockerfile,我正在尝试构建 Clang 版本 v8 及其对 Ubuntu 18.04 的依赖项。我遇到所有这些麻烦的原因是因为我找不到 32 位版本的 LLVM 库。甚至 LLVM 包本身也只有 64 位变体。正因为如此,我无法使用版本 8 的 LLVM 工具链构建我的 32 位应用程序。由于我不会在这里介绍的原因,必须使用版本 8 的 LLVM。
到目前为止,这是我所拥有的:
FROM ubuntu:18.04 AS build
ARG NUM_PARALLEL=8
RUN true \
&& dpkg --add-architecture i386 \
&& apt-get -qq update \
&& apt-get -qq install \
software-properties-common \
build-essential \
gcc-multilib \
g++-multilib \
git \
wget \
autoconf \
pkg-config \
m4 \
python-dev:i386 \
libcurl4-gnutls-dev:i386 \
libncurses-dev:i386 \
uuid-dev:i386 \
libx11-dev:i386 \
libxext-dev:i386 \
libtinfo-dev:i386 \
libedit-dev:i386 \
swig \
libedit-dev
python-dev
ENV CMAKE_BUILD_PARALLEL_LEVEL=$NUM_PARALLEL
# Ninja
RUN true \
&& git clone --depth 1 --branch v1.8.2 https://github.com/ninja-build/ninja.git \
&& cd ninja \
&& ./configure.py --bootstrap \
&& cp ninja /usr/local/bin
# CMake
RUN true \
&& git clone --depth 1 --branch v3.13.4 https://gitlab.kitware.com/cmake/cmake.git \
&& cd cmake \
&& ./bootstrap --parallel=$NUM_PARALLEL \
&& make -j$NUM_PARALLEL install
# Clang (See: https://clang.llvm.org/get_started.html)
RUN true \
&& git clone --depth 1 --branch llvmorg-8.0.0 https://github.com/llvm/llvm-project.git \
&& cd llvm-project \
&& cmake -G Ninja -B build -S llvm \
-D CMAKE_BUILD_TYPE=Release \
-D LLVM_BUILD_32_BITS:BOOL=ON \
-D LLVM_ENABLE_PROJECTS=all \
-D LLVM_BUILD_TESTS:BOOL=OFF \
-D LLVM_BUILD_EXAMPLES:BOOL=OFF \
-D LLVM_INCLUDE_EXAMPLES:BOOL=OFF \
-D LLVM_INCLUDE_TESTS:BOOL=OFF \
-D LLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
&& cmake --build build -j $NUM_PARALLEL --target install
我编译了超过 5200 个翻译单元,花了一个多小时,结果却失败了:
[5232/6435] Linking CXX shared library lib/readline.so
FAILED: lib/readline.so
: && /usr/bin/c++ -fPIC -fPIC -fvisibility-inlines-hidden -m32 -Werror=date-time -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -fdiagnostics-color -ffunction-sections -fdata-sections -Wno-deprecated-declarations -Wno-unknown-pragmas -Wno-strict-aliasing -Wno-deprecated-register -Wno-vla-extension -Wno-macro-redefined -O3 -DNDEBUG -Wl,-z,defs -Wl,-z,nodelete -m32 -shared -Wl,-soname,readline.so -o lib/readline.so tools/lldb/scripts/Python/modules/readline/CMakeFiles/readline.dir/readline.cpp.o /usr/lib/x86_64-linux-gnu/libpython2.7.so /usr/lib/x86_64-linux-gnu/libedit.so && :
/usr/lib/x86_64-linux-gnu/libpython2.7.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
到目前为止,我按照getting started 页面了解如何构建 LLVM,但我一定遗漏了一些东西。他们在示例中并没有完全进入 32 位编译。有人可以帮我弄到这栋楼吗?或者至少(并且可能更好),给我指出一个捆绑了 32 位 LLVM 库的 Clang v8 版本?
【问题讨论】:
-
您是在尝试构建 libc++ 还是整个 LLVM/Clang 工具链?另外,为什么您认为 x64 Clang 编译器不能针对 x86 架构?你对以前版本的 LLVM/Clang 做了什么?
-
我从未说过 x64 编译器不能以 x86 为目标。我的意思是 32 位 LLVM 库不可用,因此使用
-m32会由于缺少libc++导致链接器失败(因为它不适用于 i386 架构)。 -
clang 默认使用系统 libstdc++,但无论如何,如果您只想要 libc++,为什么要构建整个 LLVM(使用 ninja 和 cmake 启动)?你读过libcxx.llvm.org/docs/BuildingLibcxx.html 吗?
-
如果你已经在使用 Ubuntu,你不能先
dpkg --add-architecture i386然后apt-get install libc++1:i386吗? (见Debian multiarchitecture) -
@Botje the libc++1 package 适用于 Clang v7,而不是 v8,并且还需要 ubuntu 的 v18.10(我在 18.04 并且无法更改)。