链接错误:命令行中缺少DSO

Wil*_*den 14 linux x11 linker nvcc glfw

我是Linux的新手(使用Ubuntu 14.04 LTS 64bit),来自Windows,我正试图移植我现有的CUDA项目.

通过链接时

/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
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误:

/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
Run Code Online (Sandbox Code Playgroud)

答案似乎与本文中的解决方案密切相关(奇怪的链接错误:DSO从命令行中丢失),但鉴于我对Linux的经验不足,我无法使它们适应我自己的问题.

关于问题可能是什么的任何想法?

以下是编译期间的完整输出:https://gist.github.com/wbolden/857eddd11e4dcb915c02

这是我对Makefile的尝试:https: //gist.github.com/wbolden/135033daae04ed0d8cf3

Wil*_*den 25

希望这对像我这样熟悉Linux并且没有发现任何与Linux相关的内容的人来说会有所帮助.

正如talonmies所指出的,我无法间接链接,因此需要指定我正在使用的库所需的任何其他库.也就是说,如果我链接库A,它需要库B和C,我需要链接所有三个库以使程序正确链接.

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

x11
xrandr
xi
xxf86vm
gl
Run Code Online (Sandbox Code Playgroud)

然后,我可以通过运行找到我需要包含的库pkg-config --libs,然后是库的名称.例如,pkg-config --libs x11屈服了-lX11.

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

pkg-config --libs $(pkg-config --print-requires --print-requires-private glfw3)
Run Code Online (Sandbox Code Playgroud)

将打印出您需要链接的所有其他库(-lX11 -lXrandr -lXi -lXxf86vm -lGL).

我的程序现在成功链接,我希望这对有类似问题的任何人都有帮助.

  • 很有帮助。有趣的是你在五年后帮助了一个人。坦克人 (3认同)

Rah*_*obi 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
Run Code Online (Sandbox Code Playgroud)