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