【问题标题】:How do I build 32-bit libc++ with 64-bit clang v8 on 64-bit Ubuntu 18.04?如何在 64 位 Ubuntu 18.04 上使用 64 位 clang v8 构建 32 位 libc++?
【发布时间】: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 并且无法更改)。

标签: c++ linux clang llvm


【解决方案1】:

似乎您链接到了错误的 Python:usr/lib/x86_64-linux-gnu/libpython2.7.so

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

-DPYTHON_EXECUTABLE=PATH_TO_PYTHON-DEV:i686

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

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 2020-08-16
    • 2018-04-06
    • 1970-01-01
    • 2012-01-15
    • 2016-12-02
    • 2014-07-21
    • 2014-01-20
    • 2010-12-01
    相关资源
    最近更新 更多