如何在64位Ubuntu 18.04上使用64位clang v8构建32位libc ++?

时间:2019-04-10 13:40:42

标签: c++ linux clang llvm

我正在使用Dockerfile来构建Clang版本v8及其对Ubuntu 18.04的依赖关系。之所以要解决所有这些麻烦,是因为我找不到LLVM库的32位版本。甚至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版本?

1 个答案:

答案 0 :(得分:2)

似乎您正在针对错误的Python进行链接:usr/lib/x86_64-linux-gnu/libpython2.7.so

您可能想要将其添加到CMake命令中:

-DPYTHON_EXECUTABLE=PATH_TO_PYTHON-DEV:i686

您可能还需要设置PYTHON_LIBRARYPYTHON_INCLUDE_DIR,以确保使用了i386版本。