Search code examples
linuxlinkerx11glfwnvcc

Linking error: DSO missing from command line


I am rather new to Linux (using Ubuntu 14.04 LTS 64bit), coming from Windows, and am attempting to port over an existing CUDA project of mine.

When linking via

/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

I encounter the following error:

/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

The answer seems closely related to the solutions in this post (Strange linking error: DSO missing from command line), though given my inexperience with Linux I was unable to adapt them to my own problem.

Any ideas on what the problem could be?

Here is the full output during compilation: https://gist.github.com/wbolden/857eddd11e4dcb915c02

And here is my attempt at a Makefile: https://gist.github.com/wbolden/135033daae04ed0d8cf3


Solution

  • Hopefully this will be of help to those, like me, who are new to Linux and don't find anything related to Linux to be particularly obvious.

    As noted by talonmies, I am not able to link indirectly and as such need to specify any additional libraries required by the libraries I am using. That is to say, if I link library A, which requires libraries B and C, I need to link all three libraries for the program to link correctly.

    To find what other libraries were needed I used the pkg-config command, for which I found a guide here. Running pkg-config --print-requires --print-requires-private glfw3 gave the following output, which is the list of packages required by glfw3.

    x11
    xrandr
    xi
    xxf86vm
    gl
    

    I was then able to find what libraries I needed to include by running pkg-config --libs, followed by the name of the library. For example, pkg-config --libs x11 yielded -lX11.

    Note: you can pass multiple items to pkg-config as input, so running

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

    will print out all the additional libraries you need to link (-lX11 -lXrandr -lXi -lXxf86vm -lGL).

    My program now links successfully, I hope this helpful to anyone with a similar problem.