Con suerte, esto será de ayuda para aquellos, como yo, que son nuevos en Linux y no encuentran nada relacionado con Linux particularmente obvio.
Como lo señaló talonmies, no puedo vincular indirectamente y, como tal, necesito especificar las bibliotecas adicionales requeridas por las bibliotecas que estoy usando. Es decir, si vinculo la biblioteca A, que requiere las bibliotecas B y C, necesito vincular las tres bibliotecas para que el programa se vincule correctamente.
Para encontrar qué otras bibliotecas se necesitaban, usé el pkg-config
comando, para el cual encontré una guía aquí. Ejecutando pkg-config --print-requires --print-requires-private glfw3
dio el siguiente resultado, que es la lista de paquetes requeridos por glfw3.
x11
xrandr
xi
xxf86vm
gl
Luego pude encontrar qué bibliotecas necesitaba incluir ejecutando pkg-config --libs
, seguido del nombre de la biblioteca. Por ejemplo, pkg-config --libs x11
produjo -lX11
.
Nota:puede pasar varios elementos a pkg-config
como entrada, entonces ejecutando
pkg-config --libs $(pkg-config --print-requires --print-requires-private glfw3)
imprimirá todas las bibliotecas adicionales que necesita vincular (-lX11 -lXrandr -lXi -lXxf86vm -lGL
).
Mi programa ahora se vincula con éxito, espero que esto sea útil para cualquier persona con un problema similar.
Su enlazador necesita la biblioteca X11, debe especificar -lX11 para enlazar
Prueba
/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
Intente agregar -pthread al final de la lista de bibliotecas (línea de comando) en el Makefile.
Funcionó para mí.