我正在尝试使用 llvm 的 clang 构建 CPython 3.2。它可以使用 gcc 构建。我在 Linux Mint 12 上。
编译似乎运行良好,直到最后,它尝试生成 ./python 二进制文件。我得到的错误是:
clang -pthread -Xlinker -export-dynamic -o python Modules/python.o libpython3.2m.a -lpthread -ldl -lutil -lm
/usr/bin/ld: error: libpython3.2m.a: malformed archive header name at 8
./Modules/python.c:25: error: undefined reference to 'PyMem_Malloc'
./Modules/python.c:27: error: undefined reference to 'PyMem_Malloc'
./Modules/python.c:51: error: undefined reference to '_Py_char2wchar'
./Modules/python.c:59: error: undefined reference to 'Py_Main'
./Modules/python.c:61: error: undefined reference to 'PyMem_Free'
./Modules/python.c:63: error: undefined reference to 'PyMem_Free'
./Modules/python.c:64: error: undefined reference to 'PyMem_Free'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我已经尝试使用我可信赖的 Linux Mint 12 .deb 存储库中的 llvm 2.9,以及今天早些时候的 llvm SVN 主干,但两者都给出了相同的错误。
我突然想到,如果我可以说服 clang 使用 llvm-link 而不是 /usr/bin/ld 进行链接,事情可能会更好,但我在文档中看不到如何做到这一点。只是将 $LD 设置为 llvm-link 似乎没有帮助。
那些未定义的引用可能是红鲱鱼:如果我 nm -o libpython3.2m.a (或 llvm-nm -o libpython3.2m.a - 两者都有效),我可以看到这些符号中至少有一个确实被定义了(根据当然是纳米 - 其他工具可能并且可能确实有其他想法)。
最终,我想生成 llvm 位码而不是 ELF 二进制文件,但首先获得具有 llvm 的工作 python ELF 二进制文件将是一个令人满意的迷你里程碑。
我目前正在使用以下内容进行编译:
export PATH=/usr/local/llvm/bin:$PATH
prefix=/usr/local/p3ib-3.2
export CC='clang'
export AR='llvm-ar'
export LD='llvm-link -emit-llvm-bc'
export RANLIB='llvm-ranlib'
./configure --prefix="$prefix" && make -j 3
谢谢!