Ошибка связи: отсутствует DSO из командной строки

Я новичок в 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

Я сталкиваюсь со следующей ошибкой:

/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

Ответ, похоже, тесно связан с решениями в этой статье (Странная ошибка связывания: DSO отсутствует в командной строке), хотя, учитывая мою неопытность в Linux, я не смог адаптируйте их к моей собственной проблеме.

Любые идеи о том, что может быть проблемой?

Вот полный вывод во время компиляции: https://gist.github.com/wbolden/857eddd11e4dcb915c02

И вот моя попытка Makefile: https://gist.github.com/wbolden/135033daae04ed0d8cf3

Ответ 1

Надеюсь, это поможет тем, кто, как я, новичок в Linux, и не обнаружил, что что-то, связанное с Linux, особенно очевидно.

Как отмечено в talonmies, я не могу ссылаться косвенно и как таковая необходимость указать любые дополнительные библиотеки, необходимые для библиотек, которые я использую. То есть, если я связываю библиотеку A, для которой требуются библиотеки B и C, мне нужно связать все три библиотеки, чтобы программа правильно связывалась.

Чтобы узнать, какие библиотеки нужны, я использовал команду 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).

Моя программа теперь успешно связывается, я надеюсь, что это поможет любому, у кого есть аналогичная проблема.

Ответ 2

В вашей компоновщике нужна библиотека 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

Ответ 3

Для устранения проблемы используйте следующие команды:

FLAGS=-lX11 ./configure --prefix=/usr --disable-static
make
make install