gcc 用MinGW构建简单DLL

l0oc07j2  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我已经阅读了这里的所有内容,以及我在网上能找到的所有关于这样做的内容,但是这些信息都过时了,相互矛盾,或者不适用。我有一个非常简单的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

我不知道为什么需要这些库,因为我根本不需要在库中调用任何操作系统,但是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

如果程序“test 004”不调用DLL中的任何函数,它就可以正常工作。只要我取消注解任何调用库中任何函数的行,它就会失败,甚至不会进入main()。gdb不会给出堆栈跟踪,但会说:

During startup program exited with code 0xc0000135.

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

  • 代码都是用C编写的,不是C++。
  • 该代码不包含__declspec()或任何其他Windows系统; GCC文档非常清楚地暗示它们不是必需的,但是其他关于创建DLL的教程将它们放入了。我希望DLL像在Linux上那样导出所有内容。
  • 编译器行是由cmake生成的,因为我认为这会使它更容易移植,但是如果手工构建做正确事情的Makefile更容易的话,我很乐意放弃cmake。

任何指向正确方向的指针都将是有帮助的,包括只是为我指出那些没有过时和不适用于C++的文档。

vhmi4jdf

vhmi4jdf1#

您可以在https://github.com/brechtsanders/ci-test找到一个C语言库的最小示例,它说明了如何使用Makefile和CMake,并且代码是跨平台的(同样的代码也可以在Linux和macOS上构建)

相关问题