【问题标题】:DSO missing from command line although it is available尽管 DSO 可用,但命令行中缺少 DSO
【发布时间】: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!

标签: linker g++ ld


【解决方案1】:

将评论转换为答案:

您是否尝试在 ${ROOTLIBS}? 之前移动 $(objects2) 我认为问题可能是您在使用它们的目标文件之前指定了库。

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2019-01-12
    • 2016-11-17
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2021-05-18
    • 2016-02-18
    相关资源
    最近更新 更多