para - Enlace de DLL a través de Windows cgo-> gcc-> ld da errores de "indefinido-referencia-a-(función)"
gcc para windows 10 64 bits (3)
(Informe muy detallado del problema - tl; dr en la parte inferior!)
Realmente prefiero GLFW a Glut y quiero que su enlace de Golang funcione en Windows de 64 bits con Go 1.0.1 de 64 bits. Bajo Linux, el enlace funciona perfectamente. Esto es, en principio, factible en Windows: el usuario de GitHub chsc ha logrado hacerlo , pero está en Win32 y sus consejos aún no han resuelto mis problemas. Sin embargo, tengo una configuración Mingw64 completa y limpia basada en tdm64-gcc-4.6.1.
Ahora, esto es lo extraño: hacer que el enlace de freeglut funcione bajo Windows de 64 bits, el Go 1.0.1 de 64 bits funciona . El enlace glfw falla para mí. Quiero averiguar por qué, ya que ambos utilizan esencialmente las mismas características y técnicas de cgo .
Tenga en cuenta que actualmente tengo un paquete de reemplazo semi-horneado pero esencialmente funcional en su lugar que utiliza las llamadas LoadLibrary / GetProcAddress para exponer glfw.dll en Go. Esto funciona, pero creo que un enlace de CGO compilado de enlace duro sería más deseable que innumerables Syscall (), Syscall6 (), Syscall9 (), Syscall12 () etc. Ir a invocaciones de funciones. Si Win32 y Linux Gophers pueden tener esto, ¿por qué no nosotros, gente de Win64?
Así que aquí está mi configuración hasta ahora:
- Tengo una compilación de Golang con tres parches para hacer que funcione la vinculación de lib con cgo aplicado
- He compilado exitosamente las bibliotecas más recientes de freeglut y GLFW como DLL de 64 bits usando MinGW64.
- Los archivos de encabezado glut.h, freeglut * .h y glfw.h se colocan en / MinGW64 / x86_64-w64-mingw32 / include / GL (junto a gl.h, glaux.h, glu.h)
- Los archivos lib libfreeglut.a y libglfwdll.a se colocan en / MinGW64 / x86_64-w64-mingw32 / lib (junto a libglu32.a, libopengl32.a)
- Las DLL de 64 bits glfw.dll y freeglut64.dll se colocan en / windows y / windows / system32 (junto a opengl32.dll, glu32.dll)
- Creo que ambos , freeglut64.dll y glfw.dll, funcionan al menos la mayoría de sus programas de ejemplo lo hacen después de instalar los DLL.
Todo debería estar en su lugar, ¿verdad? Ahora, primero para el enlace exitoso (que no necesito), freeglut: cuando obtengo -x github.com/zombiezen/Go-GLUT/glut , todo está bien y puedo crear una ventana de saturación con éxito. muestre un triángulo en un test.exe de Windows compilado desde un archivo fuente .go. Gracias a -x, ve y obtén lo que hace para construir:
WORK=C:/Users/roxor/AppData/Local/Temp/go-build292908674
mkdir -p $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/
cd C:/Go/src/pkg/github.com/zombiezen/Go-GLUT/glut
C:/Go/pkg/tool/windows_amd64/cgo.exe -objdir $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -- -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ glut.go
C:/Go/pkg/tool/windows_amd64/6c.exe -FVw -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -I C:/Go/pkg/windows_amd64 -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_defun.6 -DGOOS_windows -DGOARCH_amd64 $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_defun.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_main.o -c $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_main.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_export.o -c $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_export.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/glut.cgo2.o -c $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/glut.cgo2.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/support.o -c ./support.c
gcc -I . -g -O2 -m64 -mthreads -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_main.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_export.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/glut.cgo2.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/support.o -lfreeglut
C:/Go/pkg/tool/windows_amd64/cgo.exe -objdir $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -dynimport $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_.o -dynout $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_import.c
C:/Go/pkg/tool/windows_amd64/6c.exe -FVw -I $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/ -I C:/Go/pkg/windows_amd64 -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_import.6 -DGOOS_windows -DGOARCH_amd64 $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_import.c
gcc -I . -g -O2 -m64 -mthreads -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_all.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_export.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/glut.cgo2.o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/support.o -Wl,-r -nostdlib -lgcc -lmingwex -lmingw32
C:/Go/pkg/tool/windows_amd64/6g.exe -o $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_go_.6 -p github.com/zombiezen/Go-GLUT/glut -D _/C_/Go/src/pkg/github.com/zombiezen/Go-GLUT/glut -I $WORK $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_gotypes.go $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/glut.cgo1.go
C:/Go/pkg/tool/windows_amd64/pack.exe grc $WORK/github.com/zombiezen/Go-GLUT/glut.a $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_go_.6 $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_import.6 $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_cgo_defun.6 $WORK/github.com/zombiezen/Go-GLUT/glut/_obj/_all.o
mkdir -p C:/Go/pkg/windows_amd64/github.com/zombiezen/Go-GLUT/
cp $WORK/github.com/zombiezen/Go-GLUT/glut.a C:/Go/pkg/windows_amd64/github.com/zombiezen/Go-GLUT/glut.a
Para llegar a este punto, tuve que modificar ligeramente glut.go de la siguiente manera:
// # include <GL/glut.h>
// #cgo windows LDFLAGS: -lfreeglut
// #include <stdlib.h>
// #include "support.h"
import "C"
Entonces, para resumir, esta compilación está bien, puede importarse y vincularse desde Go y usarse en el código.
Ahora para GLFW. El archivo GO se lee extremadamente similar a glut.go:
//#cgo windows LDFLAGS: -lglfwdll -lglu32 -lopengl32
//#include <stdlib.h>
//#define GLFW_DLL
//#include <GL/glfw.h>
import "C"
El #define GLFW_DLL es para que no ocurra ningún enlace estático . Aquí está la salida de go get -x github.com/jteeuwen/glfw sin embargo:
WORK=C:/Users/roxor/AppData/Local/Temp/go-build499107422
mkdir -p $WORK/github.com/jteeuwen/glfw/_obj/
cd C:/Go/src/pkg/github.com/jteeuwen/glfw
C:/Go/pkg/tool/windows_amd64/cgo.exe -objdir $WORK/github.com/jteeuwen/glfw/_obj/ -- -I $WORK/github.com/jteeuwen/glfw/_obj/ callback.go glfw.go image.go vidmode.go
C:/Go/pkg/tool/windows_amd64/6c.exe -FVw -I $WORK/github.com/jteeuwen/glfw/_obj/ -I C:/Go/pkg/windows_amd64 -o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_defun.6 -DGOOS_windows -DGOARCH_amd64 $WORK/github.com/jteeuwen/glfw/_obj/_cgo_defun.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_main.o -c $WORK/github.com/jteeuwen/glfw/_obj/_cgo_main.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_export.o -c $WORK/github.com/jteeuwen/glfw/_obj/_cgo_export.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/callback.cgo2.o -c $WORK/github.com/jteeuwen/glfw/_obj/callback.cgo2.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o -c $WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o -c $WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/vidmode.cgo2.o -c $WORK/github.com/jteeuwen/glfw/_obj/vidmode.cgo2.c
gcc -I . -g -O2 -m64 -mthreads -I $WORK/github.com/jteeuwen/glfw/_obj/ -o $WORK/github.com/jteeuwen/glfw/_obj/callback.o -c ./callback.c
gcc -I . -g -O2 -m64 -mthreads -o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_.o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_main.o $WORK/github.com/jteeuwen/glfw/_obj/_cgo_export.o $WORK/github.com/jteeuwen/glfw/_obj/callback.cgo2.o $WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o $WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o $WORK/github.com/jteeuwen/glfw/_obj/vidmode.cgo2.o $WORK/github.com/jteeuwen/glfw/_obj/callback.o -lglfwdll -lglu32 -lopengl32
# github.com/jteeuwen/glfw
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetNumberOfProcessors'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:39: undefined reference to `__imp_glfwGetNumberOfProcessors''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetKey'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:51: undefined reference to `__imp_glfwGetKey''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetTime'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:60: undefined reference to `__imp_glfwSetTime''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwExtensionSupported'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:71: undefined reference to `__imp_glfwExtensionSupported''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwPollEvents'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:80: undefined reference to `__imp_glfwPollEvents''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetMousePos'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:90: undefined reference to `__imp_glfwGetMousePos''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetJoystickParam'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:102: undefined reference to `__imp_glfwGetJoystickParam''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetProcAddress'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:112: undefined reference to `__imp_glfwGetProcAddress''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetGLVersion'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:123: undefined reference to `__imp_glfwGetGLVersion''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetMouseWheel'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:133: undefined reference to `__imp_glfwSetMouseWheel''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetJoystickPos'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:148: undefined reference to `__imp_glfwGetJoystickPos''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwOpenWindow'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:168: undefined reference to `__imp_glfwOpenWindow''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetMousePos'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:178: undefined reference to `__imp_glfwSetMousePos''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSwapInterval'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:188: undefined reference to `__imp_glfwSwapInterval''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetMouseButton'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:209: undefined reference to `__imp_glfwGetMouseButton''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetWindowTitle'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:218: undefined reference to `__imp_glfwSetWindowTitle''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetVideoModes'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:231: undefined reference to `__imp_glfwGetVideoModes''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetJoystickButtons'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:246: undefined reference to `__imp_glfwGetJoystickButtons''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwRestoreWindow'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:255: undefined reference to `__imp_glfwRestoreWindow''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwInit'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:265: undefined reference to `__imp_glfwInit''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSwapBuffers'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:274: undefined reference to `__imp_glfwSwapBuffers''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetMouseWheel'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:284: undefined reference to `__imp_glfwGetMouseWheel''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwIconifyWindow'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:293: undefined reference to `__imp_glfwIconifyWindow''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwWaitEvents'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:302: undefined reference to `__imp_glfwWaitEvents''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetWindowPos'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:312: undefined reference to `__imp_glfwSetWindowPos''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetWindowSize'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:322: undefined reference to `__imp_glfwGetWindowSize''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwDisable'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:332: undefined reference to `__imp_glfwDisable''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetWindowParam'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:344: undefined reference to `__imp_glfwGetWindowParam''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwCloseWindow'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:353: undefined reference to `__imp_glfwCloseWindow''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwOpenWindowHint'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:363: undefined reference to `__imp_glfwOpenWindowHint''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSleep'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:372: undefined reference to `__imp_glfwSleep''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwEnable'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:382: undefined reference to `__imp_glfwEnable''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwSetWindowSize'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:392: undefined reference to `__imp_glfwSetWindowSize''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwTerminate'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:411: undefined reference to `__imp_glfwTerminate''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetDesktopMode'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:420: undefined reference to `__imp_glfwGetDesktopMode''
$WORK/github.com/jteeuwen/glfw/_obj/glfw.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwGetTime'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/glfw.go:429: undefined reference to `__imp_glfwGetTime''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwFreeImage'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:38: undefined reference to `__imp_glfwFreeImage''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwReadImage'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:52: undefined reference to `__imp_glfwReadImage''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwLoadTextureImage2D'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:65: undefined reference to `__imp_glfwLoadTextureImage2D''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwLoadMemoryTexture2D'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:78: undefined reference to `__imp_glfwLoadMemoryTexture2D''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwLoadTexture2D'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:91: undefined reference to `__imp_glfwLoadTexture2D''
$WORK/github.com/jteeuwen/glfw/_obj/image.cgo2.o: In function `_cgo_680190d759a2_Cfunc_glfwReadMemoryImage'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/image.go:107: undefined reference to `__imp_glfwReadMemoryImage''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setWindowSizeCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:9: undefined reference to `__imp_glfwSetWindowSizeCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setWindowCloseCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:14: undefined reference to `__imp_glfwSetWindowCloseCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setWindowRefreshCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:19: undefined reference to `__imp_glfwSetWindowRefreshCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setMouseButtonCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:24: undefined reference to `__imp_glfwSetMouseButtonCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setMousePosCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:29: undefined reference to `__imp_glfwSetMousePosCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setMouseWheelCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:34: undefined reference to `__imp_glfwSetMouseWheelCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setKeyCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:39: undefined reference to `__imp_glfwSetKeyCallback''
$WORK/github.com/jteeuwen/glfw/_obj/callback.o: In function `setCharCB'':
C:/Go/src/pkg/github.com/jteeuwen/glfw/callback.c:44: undefined reference to `__imp_glfwSetCharCallback''
collect2: ld returned 1 exit status
Sí, es un bocado, pero esencialmente siempre es el mismo error, y bastante tarde en el procedimiento de construcción. Observe que si #define GLFW_DLL no está definido, obtengo esencialmente la misma salida, excepto sin los prefijos __imp_, y el enlace estático no es alentador para Go ni es deseable para este caso de uso particular.
Ahora, cuando gcc se queja de una "referencia indefinida a", por lo que busco en Google podría haber varias razones ...
- no puede fallar en encontrar los DLL, están en los lugares apropiados y para freeglut64.dll funciona
- no puede fallar en encontrar las .a libs; están en los lugares apropiados, y libfreeglut.a funciona, y si cambio -lglfwdll por -lblafoobar, entonces gcc falla mucho antes y se queja con razón "blafoobar no encontrado" - por lo que encuentra libglfwdll.a.
- ¿Orden de dependencias lib? Intenté -lglfwdll como la primera lib (antes de -lglu32 -lopengl32) y como la última (después de esos dos), no hay diferencia.
- ¿Es el enlace de Golang glfw defectuoso? No lo creo, funciona para otros, incluso bajo Windows para chsc (aunque de 32 bits)
TL; DR: bajo Windows 64 bits, Go 1.0.1 64 bits totalmente parcheado, CGO genera con éxito cosas para alimentar a GCC para freeglut y glfw. GCC felizmente come esas cosas para crear el enlace de freeglut, pero lo rechaza para crear el enlace de glfw, con "referencia indefinida a" para todos los C.funcs (). Tanto libfreeglut como libglfwdll se construyen e instalan correctamente como DLL de 64 bits y las librerías .h / .a están ubicadas correctamente. ¿Qué podría ser la causa?
He tenido exactamente el mismo problema por un tiempo y lo he estado investigando cada vez que trabajé en la frustración del último intento. La compilación del glfw de 32 bits para ir no fue un problema, pero la versión de 64 bits me eludió.
Hoy, después de leer el comentario de Kneo, probé su solución pero no pude hacerlo funcionar. Pero me llevó a mirar libglfwdll.a que tenía los sufijos stncall @nn mientras que libglfw.a no los tenía. Probar varios LDFLAGS (-Wl, - kill-at, -Wl, - enable-stdcall-fixup) no dio buenos resultados, estudié http://www.willus.com/mingw/yongweiwu_stdcall.html pero no pude No lo hagas funcionar.
Estaba a punto de rendirme cuando, cuando decidí ver si había una nueva versión de glfw (2.7.6) con la siguiente corrección de errores:
[Win32] Bugfix: A .def file using __stdcall naming conventions was used for the 64-bit DLL on MinGW-w64
tan larga historia corta, compilar la nueva versión de glfw e instalarlo solucionó el problema y go get github.com/jteeuwen/glfw
ahora funciona sin ningún problema.
Puedo pensar en dos posibilidades:
Los símbolos en realidad no están presentes en la biblioteca. Puedes verificar esto con
nm
. Asegúrese de que el tipo de símbolo sea una letra mayúscula; Si solo hay códigos en minúsculas, las bibliotecas no se crean correctamente.Tienes una dependencia circular. Es decir, la biblioteca A depende de la biblioteca B, que a su vez depende de A otra vez. Puede solucionar esto agregando la biblioteca al comando una segunda vez o usando grupos de vinculador (vea
ld --help
).
Tenga en cuenta que el orden de las bibliotecas en la línea de comandos es muy importante: el vinculador lee cada biblioteca, en el orden en que aparecen, busca los símbolos que necesita en ese momento y luego continúa. Si una biblioteca tardía hace referencia a un símbolo por primera vez, el enlazador no volverá a visitar las bibliotecas anteriores para encontrar la definición. Es por esto que las dependencias circulares son un problema.
Ya no es un problema con las nuevas versiones de Go, GLFW y Mingw-w64.