Building a shared library using gcc on Linux and MinGW on Windows

前端 未结 1 503
醉酒成梦
醉酒成梦 2020-12-03 07:57

I\'m having trouble with generating a build setup that allows shared libraries to be built in both Linux and Windows using gcc and MinGW, respectively. In Linux, a shared l

相关标签:
1条回答
  • 2020-12-03 08:27

    On Windows, you need to create an import library for the DLL. An import library looks like a static library, in that it defines all of the needed symbols, but it doesn't have the actual function implementations, it just has stubs. The import library will resolve the "undefined reference" errors while avoiding static linking.

    To create an import library with MinGW, follow the instructions here. The key is that when building the DLL, you must pass the option -Wl,--out-implib,libexample_dll.a to the linker to generate the import library libexample_dll.a.

    Then, when you compile your main executable, you use the -lexample_dll option (along with -L.) to link against the import library. So with your code, I think this should work:

    all: foo.o bar.o main.o
        gcc -shared foo.o -o libfoo.dll -Wl,--out-implib,libfoo.a
        gcc -shared bar.o foo.o -o libbar.dll -Wl,--out-implib,libbar.a
        gcc main.o  -Wl,-rpath=. -L. -lbar -lfoo -o main
    

    Also, note that on Windows, the calling convention for exported functions in DLL is almost always __stdcall, not the default __cdecl, so if you want your DLLs to be usable by other software, I'd recommend making them __cdecl. But that's not strictly requires, as long as both the code in the DLL and the header files agree on what the calling convention is.

    0 讨论(0)
提交回复
热议问题