2012-04-29 10 views
23

(informe muy detallado problema - tl; dr en la parte inferior!)DLL-vinculación a través de Windows cgo-> GCC> ld da "indefinido referencia a punto (función)" errores

Realmente prefiero GLFW a Glut y quiere obtener su Golang binding trabajando en Windows de 64 bits con Go 1.0.1 de 64 bits. En Linux, el enlace funciona sin problemas. Esto es, en principio, factible en Windows - GitHub usuario chc has managed a do so, pero él está en Win32 y sus consejos no resolvieron mis problemas todavía. Sin embargo, tengo una configuración completa y limpia de Mingw64 basada en tdm64-gcc-4.6.1.

Ahora aquí es lo extraño - conseguir la unión de trabajar bajo Windows de 64 bits freeglut, 64 bits Ir 1.0.1 obras - GLFW la unión falla para mí. Quiero averiguar por qué, ya que esencialmente ambos usan las mismas características y técnicas de cgo.

Nota Actualmente tengo un paquete de reemplazo hecho a mano pero esencialmente funcional que utiliza llamadas LoadLibrary/GetProcAddress para exponer glfw.dll en Go. Esto funciona, pero creo que una vinculación de CGO compilada y enlazada será más conveniente que innumerables Syscall(), Syscall6(), Syscall9(), Syscall12(), etc. Vaya a invocaciones de func. Si Win32 y Linux pueden tener esto, ¿por qué no nosotros, los amigos de Win64?

Así que aquí está mi configuración hasta ahora:

  1. Tengo un Golang construir con three patches to make lib linking work with cgo aplica
  2. he compilado con éxito el nuevo freeglut y bibliotecas GLFW como DLL de 64 bits utilizando MinGW64.
  3. Archivos de cabecera glut.h, freeglut * .hy glfw.h se colocan en \ MinGW64 \ x86_64-W64-mingw32 \ include \ GL (al lado de gl.h, glaux.h, glu.h)
  4. Los archivos Lib libfreeglut.a y libglfwdll.a se ubican en \ MinGW64 \ x86_64-w64-mingw32 \ lib (junto a libglu32.a, libopengl32.a)
  5. DLL de 64 bits glfw.dll y freeglut64.dll se ubican en \ windows y \ windows \ system32 (al lado de opengl32.dll, glu32.dll)
  6. freeglut64.dll y glfw.dll ambos trabajan, creo que al menos la mayoría de sus programas de ejemplo lo hacen después de instalar los DLL.

Todo debe estar en su lugar, ¿verdad? Ahora primero para la vinculación exitosa (que no necesito), freeglut: cuando llego a obtengo -x github.com/zombiezen/Go-GLUT/glut, todo está bien y puedo crear un exceso de éxito ventana y mostrar un triángulo en un test.exe de Windows compilado de un archivo fuente .go. Gracias a X, en ir a buscar muestra lo que hace a la construcción:

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" 

tanto, para resumir, esto funciona bien, se puede importar y vincular desde Go y usar en el código.

Ahora para GLFW. El archivo GO lee muy 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 static linking happens.Aquí está la salida de ir a buscar github.com/jteeuwen/glfw -x 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 sólo siempre el mismo error, y bastante tarde en el procedimiento de construcción. Observe que si #define GLFW_DLL no está definido, obtengo esencialmente el mismo resultado, excepto sin los prefijos __imp_, y la vinculación estática no alienta a Go ni es deseable para este caso de uso en particular.

Ahora, cuando gcc se queja de "referencia indefinida a", por lo que google podría haber varias razones ...

  • no puede ser la imposibilidad de encontrar el archivo DLL de - que están en la apropiada lugares y para freeglut64.dll funciona
  • no puede fallar encontrar las .a libs - están en los lugares apropiados, y libfreeglut.a funciona, y si cambio -lglfwdll a -lblafoobar entonces gcc falla mucho antes y con razón se queja de que "blafoobar no encontrado" - por lo que hace encuentra libglfwdll.a.
  • orden de dependencias lib? Intenté -lglfwdll como la primera lib (antes de -lglu32 -lopengl32) y como la última (después de esas dos), no hubo diferencia.
  • ¿está defectuoso el enlace Golang glfw? No lo creo, que funciona para otros, incluyendo en Windows para CEAEC (32 bits aunque)

TL; DR - bajo Windows de 64 bits, Go 1.0.1 de 64 bits con todos los parches, CGO éxito genera material para alimentar a GCC para ambos freeglut y glfw. GCC luego come felizmente esas cosas para construir el enlace Freeglut, pero lo rechaza para construir el enlace glfw, con "referencia indefinida a" para todos los C.funcs(). Tanto libfreeglut como libglfwdll están construidos e instalados correctamente como archivos DLL de 64 bits y .h/.a libs ubicados correctamente. ¿Qué podría ser la causa?

+0

64 y 32 bits usan un símbolo diferente que subraya la "política". ¿Estás seguro de que estás compensando eso? – rubenvb

+0

¿Qué significa esto exactamente? ¿Hay alguna razón por la que esto podría aplicarse a un freeglut.dll de 64 bits completamente construido pero no a una compilación completamente válida y que funcione (en otros programas no Go) de 64 bits glfw.dll? – metaleap

+0

la única manera en que esto podría suceder si la biblioteca defectuosa agrega explícitamente el guión bajo a sus nombres de funciones (he visto esto antes, creo que era WebKit). Puede verificar las exportaciones de la biblioteca usando 'nm' o' objdump', y ver si los nombres coinciden exactamente. – rubenvb

Respuesta

2

Ya no es un problema con las últimas versiones de Go, GLFW y Mingw-w64.

0

me ocurren dos posibilidades:

  1. los símbolos no están realmente presentes en la biblioteca. Puede verificar esto con nm. Asegúrese de que el tipo de símbolo sea una letra mayúscula; si solo hay códigos minúsculos, las bibliotecas no se crean correctamente.

  2. tiene una dependencia circular. Es decir. La biblioteca A depende de la biblioteca B, que a su vez depende de A nuevamente. Puede solucionar esto añadiendo la biblioteca al comando por segunda vez o usando grupos de enlazadores (vea ld --help).

Tenga en cuenta que el orden de las bibliotecas en la línea de comandos es muy importante: el enlazador lee cada biblioteca, a su vez, en el orden en que aparecen, las búsquedas de los símbolos que necesita en ese momento, y luego pasa . Si una biblioteca tardía hace referencia a un símbolo, el vinculador no volverá a visitar las bibliotecas anteriores para encontrar la definición. Esta es la razón por la cual las dependencias circulares son un problema.

4

He tenido exactamente el mismo problema desde hace un tiempo y lo he estado buscando cada vez que trabajé en la frustración del último intento. Compilar 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 intenté con su solución pero no pude hacerlo funcionar. Pero me llevó a buscar en libglfwdll.a, que tenía los sufijos @nn stdcall, mientras que libglfw.a no los tenía.Probando varios LDFLAGS (-Wl, - kill-at, -Wl, - enable-stdcall-fixup) no se obtuvieron resultados exitosos, estudié http://www.willus.com/mingw/yongweiwu_stdcall.html pero no pude hacerlo funcionar.

estaba a punto de darse por vencido cuando me 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 el nuevo La versión de glfw y su instalación corrigieron el problema y go get github.com/jteeuwen/glfw ahora funciona sin ningún problema.

Cuestiones relacionadas