go-gl-legacy/glfw

Linking errors.

Opened this issue · 7 comments

So far, two people have reported strange linking errors while trying to use this package. They both have libglfw properly installed. They both tried installing this package with goinstall and manually. This installation worked without any problems, but importing glfw into their Go programs(even the glfw example programs), yielded errors like this:

/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetVideoModes: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetJoystickButtons: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwRestoreWindow: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwInit: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwSwapBuffers: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetMouseWheel: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwIconifyWindow: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwWaitEvents: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwSetWindowPos: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetWindowSize: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwDisable: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetWindowParam: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwCloseWindow: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwOpenWindowHint: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwLoadMemoryTexture2D: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwSleep: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwEnable: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwSetWindowSize: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwTerminate: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetDesktopMode: not defined
/home/xxx/go/pkg/linux_amd64/github.com/jteeuwen/glfw.a(glfw.cgo2.o)(.text): glfwGetTime: not defined

This has so far been reported for OSX and 64-bit openSUSE. I can't seem to reproduce the problems on my own system (64-bit Arch Linux), but there is obviously something wrong.

Could those who encountered the error please let me know where your glfw.so is located? (in /usr/lib or /usr/local/lib, etc).
Also check the ouput of ldconfig for the glfw library.

There is a chance that the building/linking process works, but ldconfig is having issues trying to locate the library,

It is in /usr/local/lib but should probably go into /usr/local/lib64 .
What do you mean by output of ldconfig for glfw library. I did run su; ldconfig glfw; and it told me something about using the relative path for the cache.

sudo ldconfig -v | grep glfw should tell you where ldconf looks for libglfw.so. It might point to an old, stale version.

Could you check if it helps to create a symlink to libglfw.so in /usr/local/lib64 or in /usr/lib. Depending on where your ld.conf normally looks for libraries?

ldconfig: Can't open »stat()« for »/usr/X11R6/lib64/Xaw3d« File of foler not found.
ldconfig: Kann »stat()« für »/usr/lib64/Xaw3d« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/X11R6/lib/Xaw3d« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib/Xaw3d« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/opt/kde3/lib« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/opt/kde3/lib64« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/sharp« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/java« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/perl« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/php« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/ocaml« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/python« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/lua« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/tcl« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/guile« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: Kann »stat()« für »/usr/lib64/graphviz/ruby« nicht aufrufenen: Datei oder Verzeichnis nicht gefunden
ldconfig: path »/lib« several data
ldconfig: path »/lib64« several data
ldconfig: path »/usr/lib« several data
ldconfig: path »/usr/lib64« several data

I translated the the first line which is the same as every line below unless the last 4

I copied it. btw. it is static file .a . No dynamic library .so
Didn't work.

The problem is the static library .a . Somehow it doesn't work with your wrapper. If you install glfw you need to do make x11-dist-install which install the .so file. By default it installs to /usr/local/lib which doesn't work at least for me if I want to start the program. I copied the .so and .a file to /usr/lib64 and compiling and executing of the program works.

Good to know. I manually installed glfw as a shared library. This might explain why I never ran into the issue.

I am unsure if statically linking against the .a is even supported by cgo. Anyway, this information at can at least help others with the same problem. I will leave the issue open until I am satisfied that there is nothing I can do about it in my code. In which case I will add a note to the README about this.

Thanks for taking the time to figure this out though. Much appreciated.

After some deliberating and trying things out, I believe it is best to just insist on having people build libglfw as a shared library. I have added a note to this effect to the README.

At the risk of getting myself out of this issue the easy way, I do believe it is better than adding special-case code to the this package for the occasional situation where one might have libglfw as a static library.