2012-04-29 2 views
23

(Очень подробный отчет проблема - Т.Л., дг на дне!)DLL-соединение с помощью Windows, cgo-> gcc-> л.д. дает «неопределен-ссылочный-to (функция)» ошибки

Я действительно предпочитаю GLFW to Glut и хотите получить его Golang binding, работающий под Windows 64-bit с Go 1.0.1 64-bit. Под Linux привязка работает безупречно. Это в принципе можно выполнить под Windows - пользователь GitHub chsc has managed до do so, но он на Win32, и его советы еще не разрешили мои проблемы. Однако у меня есть полный и чистый Mingw64, основанный на tdm64-gcc-4.6.1.

Теперь вот странное дело - получение freeglut привязки к работе в 64-разрядной ОС Windows, 64-разрядная версия Go 1.0.1 работает - glfw связывания терпит неудачу для меня. Я хочу выяснить, почему, поскольку они по существу используют одни и те же функции и методы cgo.

Примечание. В настоящее время у меня есть самодельный полупеченный, но по существу рабочий пакет замены, который использует вызовы LoadLibrary/GetProcAddress, чтобы разоблачить glfw.dll в Go. Это работает, но я думаю, что жестко связанная скомпилированная привязка CGO была бы более желательной, чем бесчисленные вызовы Syscall(), Syscall6(), Syscall9(), Syscall12() и т. Д. Go func invocations. Если у Win32 и Linux gophers это может быть, почему бы нам не Win64?

Так вот моя установка до сих пор:

  1. У меня есть Golang строить с three patches to make lib linking work with cgo применяется
  2. Я успешно скомпилирован новейшую freeglut и библиотеки GLFW, как 64-разрядные библиотеки DLL с помощью MinGW64.
  3. файлы заголовков glut.h, freeglut * .h и glfw.h помещаются в \ MinGW64 \ x86_64-w64-mingw32 \ включать \ GL (рядом с gl.h, glaux.h, glu.h)
  4. Lib файлы libfreeglut.a и libglfwdll.a размещаются в \ MinGW64 \ x86_64-w64-mingw32 \ lib (рядом с libglu32.a, libopengl32.a)
  5. 64-разрядные DLL-файлы glfw.dll и freeglut64.dll помещаются в \ windows и \ windows \ system32 (рядом с opengl32.dll, glu32.dll)
  6. freeglut64.dll и glfw.dll оба работают, я считаю - по крайней мере, большинство их примерных программ после установки DLL.

Все должно быть на месте, не так ли? Теперь сначала для успешного привязки (что мне не нужно), freeglut - когда я go get -x github.com/zombiezen/Go-GLUT/glut, все построено просто отлично, и я могу успешно создать перенасыщение window и показать треугольник в файле test.exe Windows, скомпилированном из исходного файла .go. Благодаря -x, иди показывает, что он делает, чтобы построить:

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 

Чтобы добраться до этой точки, я должен немного изменить glut.go следующим образом:

// # include <GL/glut.h> 
// #cgo windows LDFLAGS: -lfreeglut 
// #include <stdlib.h> 
// #include "support.h" 
import "C" 

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

Теперь для GLFW. Файл GO читает очень похож на glut.go:

//#cgo windows LDFLAGS: -lglfwdll -lglu32 -lopengl32 
//#include <stdlib.h> 
//#define GLFW_DLL 
//#include <GL/glfw.h> 
import "C" 

#define GLFW_DLL так что no static linking happens.Вот выход идут получить -x github.com/jteeuwen/glfw однако:

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 

Да, это рот - но, по сути просто всегда та же ошибка, и довольно поздно в процедуре сборки. Обратите внимание, что если #define GLFW_DLL не определен, я получаю по существу тот же результат, за исключением без префиксов __imp_, а статические ссылки не поощряют Go и не желательны для этого конкретного случая использования.

Теперь, когда GCC жалуется на «неопределенная ссылка на», от того, что я Google там может быть много причин, ...

  • не может быть неспособность найти DLL файлы - они в соответствующих места и для freeglut64.dll это работает
  • не может быть неспособность найти .a libs - они находятся в соответствующих местах, а libfreeglut.a работает, и если я изменяю -lglfwdll на -lblafoobar, то gcc терпит неудачу ранее и справедливо жалуется «blafoobar не найден» - так он делает найти libglfwdll.a.
  • Порядок зависимостей от lib? Я попробовал -lglfwdll как первый lib (до -lglu32 -lopengl32) и как последний (после этих двух), никакой разницы.
  • является обязательным связыванием Golang glfw? Не думайте так, работает для других, в том числе под Windows для chsc (32-bit but)

TL; DR - под Windows 64-бит, Go 1.0.1 64-бит полностью исправленный, CGO успешно генерирует материал для подачи в GCC для и freeglut и glfw. GCC затем счастливо питается этим материалом для создания привязки freeglut, , но отклоняет его для построения привязки glfw с «неопределенной ссылкой» для всех C.funcs(). Оба libfreeglut и libglfwdll правильно построены и установлены как 64-разрядные библиотеки DLL, а .h/.a libs правильно расположены. Что может быть причиной?

+0

64 и 32-бит используют другой символ, подчеркивающий «политику». Вы уверены, что это компенсируете это? – rubenvb

+0

Что это значит? Есть ли причина, по которой это может быть применимо к полностью построенному 64-битовому файлу freeglut.dll, но не к полной версии, действующей и работающей (в других программах, отличных от Go) 64-bit glfw.dll? – metaleap

+0

единственный способ, которым это может произойти, если дефектная библиотека явно добавляет подчеркивание к ее именам функций (я видел это раньше, я думаю, что это был WebKit). Вы можете проверить экспорт библиотеки с помощью 'nm' или' objdump' и посмотреть, соответствуют ли имена точно. – rubenvb

ответ

2

Больше не проблема с новейшими версиями Go, GLFW и Mingw-w64.

0

я могу думать о двух возможностях:

  1. символы на самом деле нет в библиотеке. Вы можете проверить это с помощью nm. Убедитесь, что тип символа - буква верхнего регистра; если есть только коды с нижним регистром, то библиотеки не построены правильно.

  2. У вас есть круговая зависимость. То есть Библиотека A зависит от библиотеки B, которая, в свою очередь, снова зависит от A. Вы можете обойти это, добавив библиотеку в команду во второй раз или используя группы компоновщиков (см. ld --help).

Обратите внимание, что порядок библиотек в командной строке очень важен: линкер читает каждую библиотеку, в свою очередь, в порядке их появления, поиск символов он нуждается в то время, а затем переходит на , Если символ сначала ссылается на позднюю библиотеку, компоновщик не будет пересматривать предыдущие библиотеки, чтобы найти определение. Вот почему круговые зависимости являются проблемой.

4

У меня была такая же проблема какое-то время, и я изучал ее каждый раз, когда я работал от разочарования последней попытки. Компиляция 32-битного glfw для go не была проблемой, но 64-разрядная версия ускользала от меня.

Сегодня, прочитав комментарий kneo, я попробовал его решение, но не смог заставить его работать. Но это привело меня к просмотру libglfwdll.a, у которого были суффиксы @nn stdcall, в то время как у libglfw.a их не было.Попытка различных LDFLAGS (-Wl, - kill-at, -Wl, - enable-stdcall-fixup) не дала успешных результатов, я изучил http://www.willus.com/mingw/yongweiwu_stdcall.html, но не смог заставить ее работать.

я собирался сдаваться, когда я, когда я решил посмотреть, есть ли новая версия glfw (2.7.6) со следующим багфиксом:

[Win32] Bugfix: A .def file using __stdcall naming conventions was used for the 64-bit DLL on MinGW-w64 

так Короче говоря, составление нового Версия glfw и установка исправили проблему, и go get github.com/jteeuwen/glfw теперь работает без проблем.

 Смежные вопросы

  • Нет связанных вопросов^_^