链接错误:命令行缺少DSO

22

我对Linux还比较陌生(使用的是Ubuntu 14.04 LTS 64位),之前一直在用Windows系统。现在我正在尝试将我的一个现有CUDA项目移植到Linux上。

当进行链接时,使用以下命令:

/usr/local/cuda/bin/nvcc -arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart

我遇到了以下错误:

/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_clipboard.c.o): undefined reference to  symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [CUDANN] Error 1
答案:答案似乎与此帖子中的解决方案密切相关(Strange linking error: DSO missing from command line),但鉴于我在Linux方面的经验不足,无法将它们适应到自己的问题上。 任何关于问题可能是什么的想法吗? 这是编译期间的完整输出:https://gist.github.com/wbolden/857eddd11e4dcb915c02 这是我尝试创建的Makefile:https://gist.github.com/wbolden/135033daae04ed0d8cf3

连接器明确告诉您问题所在,而您链接的答案则明确告诉您如何修复它。显然,您正在运行禁止间接链接的平台。添加所需附加库的库依赖项(提示:libX11正好显示在连接器错误消息中)。我将从此问题中删除CUDA标签,因为它与CUDA或CUDA编程无关。 - talonmies
8
如我所说,我对Linux还比较陌生(只接触了几天),对于有一定经验的人来说显而易见的事情对我来说并不是那么清楚。使用ldd命令,我得到了以下结果https://gist.github.com/WilliamHBolden/51a8721b4f8d89df2cef 但我不知道该怎么做。我尝试添加-L/usr/x86_64-linux-gnu和-L/lib64,但这并没有改变错误。 - Will Bolden
也许你必须离开Gist或使用其他系统,因为现在Gist不可用。 - Juan Garcia
1
我的用户名已更改,请将WilliamHBolden替换为wbolden。 - Will Bolden
可能是奇怪的链接错误:命令行中缺少DSO的重复问题。 - jww
4个回答

40

希望这对像我一样的新手有所帮助,因为Linux相关内容并不是特别明显。

如talonmies所指出的那样,我不能间接地链接库,因此需要指定我正在使用的库所需的任何其他库。也就是说,如果我链接需要库B和C的库A,我需要链接这三个库才能正确链接程序。

为了找到其他所需的库,我使用了pkg-config命令,在这里我找到了一个指南这里。运行pkg-config --print-requires --print-requires-private glfw3给出了以下输出,这是glfw3所需的软件包列表。

x11
xrandr
xi
xxf86vm
gl

我随后通过运行pkg-config --libs,然后是库的名称,找到了需要包含的库。例如,pkg-config --libs x11返回-lX11

注意:您可以将多个项目作为输入传递给pkg-config,因此可以运行

pkg-config --libs $(pkg-config --print-requires --print-requires-private glfw3)

将会打印出你需要链接的所有附加库(-lX11 -lXrandr -lXi -lXxf86vm -lGL)。

我的程序现在已经成功链接,希望这对有类似问题的人有所帮助。


3
非常有帮助。你在五年后帮助某个人是很有趣的。谢谢,伙计。 - Hamid Reza
出色的回答! - Stepan Yakovenko

7
你的链接器需要X11库,你需要在链接器中指定-lX11。
尝试:
/usr/local/cuda/bin/nvcc -arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart -lX11

我早些时候尝试过这个,但不幸的是没有解决我的问题。这是我得到的新错误 https://gist.github.com/WilliamHBolden/225d2064f844d33d958f - Will Bolden
@will bolden:这个答案确实解决了你的问题。添加x11库消除了dso错误。现在你有不满足的依赖关系,请添加它们。 - talonmies

1
尝试在Makefile的库列表(命令行)末尾添加-pthread。
对我有效。

0
请使用以下命令来解决此问题:
FLAGS=-lX11 ./configure --prefix=/usr --disable-static
make
make install

7
你想再添加一些论据吗?这个错误是什么,这样做如何修复它? - hB0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接