我正在尝试使用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)
我已经尝试过llvm 2.9,这是我可靠的Linux Mint 12 .deb repo,以及今天早些时候的llvm的SVN主干,但两者都给出了相同的错误。
在我看来,如果我能说服clang使用llvm-link而不是/ usr / bin / ld进行链接,那么事情会好一些,但我在文档中没有看到如何做到这一点。只需将$ LD设置为llvm-link似乎没有帮助。
那些未定义的引用可能是红色的鲱鱼:如果我nm -o libpython3.2m.a(或llvm-nm -o libpython3.2m.a - 两者都有效),我可以看到这些符号中至少有一个确实是定义(根据nm当然 - 其他工具可能也可能有其他想法)。
最终我想生成llvm bitcode而不是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
谢谢!