Ошибка связи: отсутствует 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