erkkah / tigr

TIGR - the TIny GRaphics library for Windows, macOS, Linux, iOS and Android.
Other
745 stars 44 forks source link

DLL Build #63

Open gAndy50 opened 1 month ago

gAndy50 commented 1 month ago

Is it possible to build TIGR as a DLL or shared library?

JettMonstersGoBoom commented 1 month ago

https://github.com/JettMonstersGoBoom/tigr I have an example "examples/hellodll" for building TIGR as a DLL. just changes to the tigr.h file. and some compile flags. I haven't tested on OSX or Linux though. it "should" work.

gAndy50 commented 1 month ago

Thanks. I tried to build it, but I keep getting __mingw_winmain undefined reference error. I'm trying to build it under Windows.

JettMonstersGoBoom commented 1 month ago

that's odd. I'm using x86_64-w64-mingw32 version 13.2.0. to double check I didn't miss anything, I completely removed the archive from my machine and pulled that version, it compiled with makefile there ?

gAndy50 commented 1 month ago

When I do this: gcc -c tigr.c - It compiles fine (It works fine using mingw32-make as well) But when I do this: gcc -shared -o tigr.dll tigr.o - it comes up with the __ming_winmain errors.

JettMonstersGoBoom commented 1 month ago

-DTIGR_BUILDSHARED is needed for the DLL, -DTIGR_SHARED is needed for the executable that references it. please see the makefile provided.

gAndy50 commented 1 month ago

Alright, I think I almost got it. I did mingw32-make, it outputs this: gcc ../../tigr.c -DTIGR_BUILDSHARED -shared -I../.. -Os -s -DTIGR_SHARED -s -lopengl32 -lgdi32 -o tigr.dll But these errors appear: undefined reference to `__mingw_winmain_hInstance

JettMonstersGoBoom commented 1 month ago

that error when building the DLL ? I'm not really sure what's going on there. did you clean any .o or .dll files first ?

gAndy50 commented 1 month ago

I can't figure out why it isn't building either, I'll try a few more things.

JettMonstersGoBoom commented 1 month ago

I just installed w64devkit and git on a clean machine and still don't have any issues ? I don't see how mingw would be different for something this trivial.

gAndy50 commented 1 month ago

I figured it out. The error was coming from the WinMain function. To build a DLL, you don't need a Winmain function.

add to line 2699 in tigr.c #ifndef TIGR_BUILDSHARED add to line 2724 in tigr. c #endif

--begin of makefile CFLAGS += -Os -s LDFLAGS += -shared ifeq ($(OS),Windows_NT) CFLAGS += -DTIGR_SHARED LDLIBS += -lopengl32 -lgdi32 LIBEXT := .dll else CFLAGS += -fPIC LIBPRE := lib UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) LDLIBS += -framework OpenGL -framework Cocoa LIBEXT := .dylib else LDLIBS += -lGLU -lGL -lX11 LIBEXT := .so endif endif

$(LIBPRE)tigr$(LIBEXT): tigr.c gcc $(CFLAGS) -DTIGR_BUILDSHARED $(LDFLAGS) -o $@ $< $(LDLIBS) -- end of make file

--build DLL or shared library tigr.dll: tigr.c gcc -Os -s -DTIGR_SHARED -DTIGR_BUILDSHARED -shared -o $@ $< -lopengl32 -lgdi32

Thanks to https://github.com/ghaberek for his help with this.

JettMonstersGoBoom commented 1 month ago

I agree you shouldn't need it, but it also shouldn't cause an issue with building and linking a dll. At least you got it resolved.

gAndy50 commented 1 month ago

Yes, it does seem odd, but I got it to work and have a DLL now. Thanks for your help as well.

JettMonstersGoBoom commented 1 month ago

added the change to my repo. just incase someone else runs into this.

gAndy50 commented 1 month ago

Sounds good. I've made a wrapper for the TIGR library for OpenEuphoria. https://github.com/gAndy50/EuTigr