用MinGW构建简单的DLL

时间:2013-04-01 01:13:13

标签: c gcc dll mingw

我已经阅读了这里的所有内容以及我在网上可以找到的关于这样做的所有内容,但这些信息已经过时,相互矛盾或不适用。我在C中有一个非常简单的库,我在Linux中编译成一个共享库,并且所有工作都很精彩。我想将其移植到Windows DLL。我从20世纪90年代开始就没有对Windows进行过编程,但我对它的复杂性并不完全无能为力(实际上,它们是我使用Linux的原因: - )。

生成库的MinGW编译器行是这个(由cmake生成):

gcc.exe -Wl,--export-all -Wl,--enable-auto-import -shared -o libonejoker.dll -Wl,--out-implib,libonejoker.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive CMakeFiles/onejoker.dir/objects.a -Wl,--no-whole-archive -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

不确定为什么或者我是否需要所有这些库,因为我根本没有在库中进行任何OS调用,但是cmake将它们放在那里。这会创建dll和.dll.a。我告诉cmake添加-Wl, - export-all,尽管这应该是默认值。尝试将我的简单测试程序与新创建的dll链接起来:

gcc.exe -g @CMakeFiles/test004.dir/includes_C.rsp -o CMakeFiles/test004.dir/test004.c.obj -c /c/Users/Lee/Projects/OneJoker/src/tests/test004.c

gcc.exe -g -Wl,--whole-archive CMakeFiles/test004.dir/objects.a -Wl,--no-whole-archive  -o test004.exe -Wl,--out-implib,libtest004.dll.a -Wl,--major-image-version,0,--minor-image-version,0  -L/C/Users/Lee/Projects/OneJoker/build/src/lib  ../lib/libonejoker.dll.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

如果程序“test004”没有调用DLL中的任何函数,它可以正常工作。一旦我取消注释从库中调用任何函数的任何行,它就会无声地失败,甚至无法访问main()。 gdb没有给出堆栈跟踪,但是说:

During startup program exited with code 0xc0000135.

谷歌搜索没有任何有用的东西。请注意:

  • 代码全部用C, NOT C ++。
  • 代码不包含__declspec()或任何其他Windows-isms; GCC文档非常明确地暗示它们不是必需的,但是其他关于创建DLL的教程也将它们放入其中。我希望DLL能够像在Linux上一样导出所有内容。
  • 编译器行是由cmake生成的,因为我认为这样可以更容易移植,但是如果只是手工构建Makefiles做正确的事情,我会很乐意放弃cmake。

任何指向正确方向的指针都会有所帮助,包括指向我没有过时的文档而不是C ++。

0 个答案:

没有答案