我正在尝试使用 llvm-3.1 包进行编译。我运行的是 12.04 x64 (3.2.0-26 内核) && 12.10 (3.5.0-4) x64 从 quantal 反向移植的 llvm-3.1,然后是 debian 实验版。
接下来我尝试使用原生 ubuntu llvm-3.1 包的 12.10;这也失败了。
用户@系统:/tmp/llvm-test# make 编译 cpp yacc 文件:decaf-llvm.y 输出文件:decaf-llvm bison -b decaf-llvm -d decaf-llvm.y /bin/mv -f decaf-llvm.tab.c decaf-llvm.tab.cc flex-odecaf-llvm.lex.cc decaf-llvm.lex g++ -o ./decaf-llvm decaf-llvm.tab.cc decaf-llvm.lex.cc decaf-stdlib.c `llvm-config --cppflags --ldflags --libs core jit native` -ly -ll /usr/lib/llvm-3.1/lib/libLLVMSupport.a(Signals.o): 在函数“PrintStackTrace(void*)”中: (.text+0x6c): 对‘dladdr’未定义引用 /usr/lib/llvm-3.1/lib/libLLVMSupport.a(Signals.o): 在函数“PrintStackTrace(void*)”中: (.text+0x18f): 对‘dladdr’未定义引用 collect2:错误:ld 返回 1 退出状态 make:*** [decaf-llvm] 错误 1
我知道代码可以工作,因为我已经在 centos 中很好地运行它llvm-3.1-6.fc18(rpm)
谷歌对此提供了一些帮助:
“在某些系统上,包括 Ubuntu 11.10,链接可能会失败,并显示消息称函数 PrintStackTrace(void*) 中的 libLLVMSupport.a 对 dladdr 的引用未定义。”
“解决方法是使用 cmake 编译 LLVM 并指定以下变量:-DCMAKE_EXE_LINKER_FLAGS=-ldl”
http://svn.dsource.org/projects/bindings/trunk/llvm-3.0/Readme
我仔细检查了 y ldflags 并且一切似乎正常。
用户@系统:/llvm-config --ldflags -L/usr/lib/llvm-3.1/lib -lpthread-lffi-ldl-lm
我不清楚下一步该做什么;有什么建议吗?
答案1
我问过(并回答过)类似的问题在 Stack Overflow 上. 我对这个问题的回答适用于您的问题:
需要符号的库包含在 中-lLLVMSupport
,因此-ldl
必须位于 之后-lLLVMSupport
。请参阅为什么 gcc 中 '-l' 选项的顺序很重要?在 Stack Overflow 上。您需要更改此设置:
`llvm-config --cppflags --ldflags --libs core jit native`
对此:
`llvm-config --cppflags --libs core jit native` `llvm-config --ldflags`
并且链接器应该会成功。如果您找到更好的解决方案来修复 的顺序--ldflags
,请告诉我。
答案2
sudo apt-get install libx11-xcb-dev llvm-dev x11proto-gl-dev x11proto-dri2-dev libxext-dev libxdamage-dev libxfixes-dev libxcb-glx0 libxcb-glx0-dev libpng12-dev