【发布时间】:2014-08-16 22:37:45
【问题描述】:
我正在使用 c++ 代码进行物理模拟,它使用了很多外部库(如 GSL 和 cern 的 ROOT)。尝试重新编译项目时,我遇到了链接问题。通过以下方式运行最终文件的编译时:
g++ -fno-inline -O2 -fpic -o main.out ${ROOTINCS} main.o ext.o ${ROOTLIBS} $(objects2)
与:
- objects2= 我们制作的许多 .o 文件
- ROOTLIBS=-L/usr/local/lib/root -lTree -lRIO -lNet -lHist -lMathCore -lCore -lGraf -lGraf3d -lGpad -lMatrix -lThread -lCint -lPhysics -lPostscript -lRint -lSpectrum -lg
- ROOTINCS=-pthread -m64
我收到烦人的错误:
/usr/bin/ld: /usr/local/lib/root/libHist.so: undefined reference to symbol 'gRandom'
/usr/local/lib/root/libMathCore.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
问题是 nm -C run on libMathCore states 'gRandom' 被声明在那里。 -lMathCore 也出现在我的命令行中。
当我运行 ld 检查它是否理解标志时:
ld -L/usr/local/lib/root -lMathCore --verbose 2>/dev/null
它不会抱怨并尝试正确链接。
根据https://stackoverflow.com/a/24675715/3602168,我的链接中库的顺序是正确的(libHist 使用 libMathCOre,因此首先说明)。
编译在 ubuntu 14.04 64 位的 g++ 4.8.2 下运行
【问题讨论】:
-
您是否尝试在
${ROOTLIBS}之前移动$(objects2)?我认为问题可能是您在使用它们的目标文件之前指定了库。 -
哦,这行得通!非常感谢@msandiford!