2012-04-29 56 views
23

(बहुत विस्तृत समस्या रिपोर्ट - tl; तल पर डॉ!)DLL-लिंकिंग विंडोज के माध्यम से cgo-> gcc-> ld देता है "अपरिभाषित संदर्भ-हैं- (समारोह)" त्रुटियों

मैं वास्तव में पसंद करते हैं ग्लूट के लिए जीएलएफडब्ल्यू और विंडोज 1.0 -64-बिट के साथ विंडोज 64-बिट के तहत काम कर रहे Golang binding प्राप्त करना चाहते हैं। लिनक्स के तहत, बाध्यकारी यह बेकार ढंग से काम करता है। यह विंडोज़ के तहत सिद्धांत रूप में करने योग्य है - गिटहब उपयोगकर्ता chsc has managed से do so पर, लेकिन वह Win32 पर है और उसकी युक्तियों ने अभी तक मेरे मुद्दों का समाधान नहीं किया है। हालांकि मेरे पास tdm64-gcc-4.6.1 के आधार पर एक पूर्ण और साफ Mingw64 सेट अप है।

अब यहाँ अजीब बात है - freeglut 64-बिट Windows के तहत काम के लिए बाध्य हो रही, 64-बिट 1.0.1 जाओ काम करता है - glfw बाध्यकारी मेरे लिए विफल रहता है। मैं यह जानना चाहता हूं कि क्यों, अनिवार्य रूप से दोनों एक ही कागो सुविधाओं और तकनीकों का उपयोग करते हैं

नोट वर्तमान में मेरे पास आधे बेक्ड लेकिन अनिवार्य रूप से कार्यस्थल प्रतिस्थापन पैकेज है जो लोड में लाइब्रेरी/GetProcAddress कॉल का उपयोग करता है ताकि glfw.dll को गो में प्रदर्शित किया जा सके। यह काम करता है लेकिन मुझे लगता है कि एक हार्ड-लिंक्ड संकलित-सीजीओ बाध्यकारी अनगिनत Syscall(), Syscall6(), Syscall9(), Syscall12() आदि से अधिक वांछनीय होगा fun fun invocations जाओ। यदि Win32 और Linux gophers के पास यह हो सकता है, तो हम Win64 लोगों को क्यों नहीं?

तो यहाँ मेरी सेटअप अब तक बताया गया है:

  1. मैं एक Golang निर्माण three patches to make lib linking work with cgo लागू किए गए हैं
  2. मैं सफलतापूर्वक MinGW64 का उपयोग कर 64-बिट DLLs के रूप में नवीनतम freeglut और GLFW पुस्तकालयों तैयार की है की है।
  3. हैडर फ़ाइलें glut.h, freeglut * ज और glfw.h \ MinGW64 \ x86_64-W64-mingw32 \ \ जीएल (अगले gl.h को, glaux.h, glu.h) शामिल
  4. में रखा जाता है Lib फ़ाइलें libfreeglut.a और libglfwdll.a \ MinGW64 \ x86_64-w64-mingw32 \ lib (libglu32.a, libopengl32.a के बगल में)
  5. 64-बिट DLLs glfw.dll और freeglut64.dll में रखा गया है \ windows और \ windows \ system32 (opengl32.dll के आगे, glu32.dll)
  6. freeglut64.dll और glfw.dll दोनों काम, मेरा मानना ​​है - कम से कम उनके उदाहरण प्रोग्राम डीएलएल स्थापित करने के बाद करते हैं।

सब कुछ जगह में होना चाहिए, है ना? अब पहले सफल बाध्यकारी (जिसे मुझे आवश्यकता नहीं है) के लिए, फ्रीग्लूट - जब मैं get -x github.com/zombiezen/Go-GLUT/glut पर जाएं, सब ठीक है और मैं सफलतापूर्वक एक ग्लूट बना सकता हूं खिड़की और एक .go स्रोत फ़ाइल से संकलित एक Windows test.exe में एक त्रिकोण दिखाएं। धन्यवाद -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 फ़ाइल अत्यंत 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 

हाँ, यह है एक कौर - लेकिन अनिवार्य रूप से सिर्फ हमेशा एक ही त्रुटि है, और निर्माण की प्रक्रिया में काफी देर से। ध्यान दें कि #Dfine GLFW_DLL परिभाषित नहीं किया गया है, तो मुझे अनिवार्य रूप से __imp_ उपसर्गों को छोड़कर एक ही आउटपुट मिलता है - और स्थिर लिंकिंग न तो गो के लिए प्रोत्साहित करती है और न ही यह इस विशेष उपयोग-मामले के लिए वांछनीय है।

अब

, जब जीसीसी से मैं क्या गूगल वहाँ विभिन्न कारणों से हो सकता है, के बारे में करने के लिए "अपरिभाषित संदर्भ" शिकायत ...

  • यह DLL के खोजने के लिए विफलता नहीं किया जा सकता है - वे उचित में हैं स्थानों और freeglut64.dll के लिए यह काम करता है
  • यह .a libs को खोजने में विफल नहीं हो सकता है - वे उपयुक्त स्थानों में हैं, और libfreeglut.a काम करता है, और यदि मैं बदलता हूं- lglfwdll to -lblafoobar तो gcc बहुत विफल रहता है पहले और सही शिकायत "blafoobar नहीं मिला" - तो यह libglfwdll.a ढूंढता है।
  • lib निर्भरताओं का आदेश? मैंने पहली lib (पहले -lglu32 -lopengl32) के रूप में और आखिरी (उन दोनों के बाद) के रूप में -lglfwdll की कोशिश की, कोई फर्क नहीं पड़ता।
  • गोलांग glfw बाध्यकारी दोषपूर्ण है? ऐसा लगता है मत करो, दूसरों के लिए काम करता है, chsc (32-बिट हालांकि)

टी एल के लिए Windows के तहत सहित; डॉ - विंडोज 64-बिट के तहत, जाओ 1.0.1 64-बिट पूरी तरह से समझौता, सीजीओ सफलतापूर्वक दोनों फ्रीग्लूट और glfw के लिए जीसीसी में फ़ीड करने के लिए सामान उत्पन्न करता है। जीसीसी तब खुशी से फ्रीगूट बाध्यकारी बनाने के लिए उस सामान को खाती है, लेकिन सभी सीफंक्स() के लिए "अनिर्धारित संदर्भ" के साथ glfw बाध्यकारी बनाने के लिए इसे अस्वीकार कर देती है। Libfreeglut और libglfwdll दोनों को सही ढंग से बनाया गया है और 64-बिट DLLs और .h/.a libs के रूप में सही ढंग से स्थापित किया गया है। क्या कारण हो सकता है?

+0

64 और 32-बिट "नीति" को एक अलग प्रतीक का उपयोग करते हैं। क्या आप वाकई इसके लिए क्षतिपूर्ति कर रहे हैं? – rubenvb

+0

इसका क्या अर्थ है? क्या कोई कारण यह है कि यह पूरी तरह से निर्मित 64-बिट freeglut.dll पर लागू हो सकता है लेकिन पूर्ण रूप से वैध और काम नहीं कर रहा है (अन्य गैर-गो प्रोग्राम्स में) 64-बिट glfw.dll? – metaleap

+0

यह एकमात्र तरीका हो सकता है यदि दोषपूर्ण लाइब्रेरी स्पष्ट रूप से अंडरस्कोर को इसके फ़ंक्शन नामों में जोड़ती है (मैंने इसे पहले देखा है, मुझे लगता है कि यह वेबकिट था)। आप 'nm' या' objdump' का उपयोग करके लाइब्रेरी के निर्यात की जांच कर सकते हैं, और देख सकते हैं कि नाम बिल्कुल मेल खाते हैं या नहीं। – rubenvb

उत्तर

2

अब गो, जीएलएफडब्ल्यू और मिंगव-डब्ल्यू 64 की नवीनतम रिलीज के साथ कोई समस्या नहीं है।

0

मैं दो संभावनाएं के बारे में सोच सकते हैं:

  1. प्रतीकों वास्तव में पुस्तकालय में मौजूद नहीं हैं। आप इसे nm के साथ देख सकते हैं। सुनिश्चित करें कि प्रतीक प्रकार ऊपरी-केस अक्षर है; यदि केवल निचले केस कोड हैं तो पुस्तकालयों को सही नहीं बनाया गया है।

  2. आपके पास एक परिपत्र निर्भरता है। अर्थात। लाइब्रेरी ए लाइब्रेरी बी पर निर्भर करता है जो बदले में फिर से निर्भर करता है। आप लाइब्रेरी को दूसरी बार कमांड में जोड़ने या लिंकर समूहों का उपयोग करके प्राप्त कर सकते हैं (ld --help देखें)।

ध्यान दें कि कमांड लाइन पर लाइब्रेरी के क्रम बहुत महत्वपूर्ण है: लिंकर क्रम में वे दिखाई देते में बारी में प्रत्येक पुस्तकालय पढ़ता है,, प्रतीक यह समय की जरूरत है, और फिर इनकी खोज के लिए ले जाता है । यदि किसी प्रतीक को देर से लाइब्रेरी द्वारा संदर्भित किया गया है, तो लिंकर परिभाषा खोजने के लिए पहले पुस्तकालयों की समीक्षा नहीं करेगा। यही कारण है कि परिपत्र निर्भरता एक समस्या है।

4

मुझे थोड़ी देर के लिए एक ही समस्या है और मैं इसे हर बार देख रहा हूं जब मैंने अंतिम प्रयास की निराशा से काम किया था। जाने के लिए 32-बिट glfw संकलन कोई समस्या नहीं थी, लेकिन 64 बिट संस्करण ने मुझे eluded।

आज, घुटने की टिप्पणी पढ़ने के बाद मैंने अपना समाधान करने की कोशिश की लेकिन इसे काम नहीं कर सका। लेकिन यह मुझे libglfwdll.a को देखने के लिए नेतृत्व करता है जिसमें @nn stdcall प्रत्यय था जबकि libglfw.a उनके पास नहीं था।विभिन्न एलडीएफएलजीएस (-Wl, - kill-at, -Wl, - enable-stdcall-fixup) का प्रयास करने से सफल परिणाम नहीं मिले, मैंने http://www.willus.com/mingw/yongweiwu_stdcall.html का अध्ययन किया लेकिन इसे काम नहीं कर सका।

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

इतने लंबे समय कहानी कम, नए संकलन:

मैं जब मैं जब मैं बग सुधार निम्नलिखित के साथ अगर कोई glfw (2.7.6) का एक नया संस्करण था देखने के लिए फैसला किया है के बारे में देने के लिए था glfw संस्करण और इसे स्थापित करने से समस्या ठीक हो गई है और go get github.com/jteeuwen/glfw अब किसी भी समस्या के बिना काम करता है।