我已经阅读了这里的所有内容以及在网上可以找到的有关执行此操作的所有信息,但这些信息已过时,自相矛盾或不适用。我在C语言中有一个非常简单的库,可以将其编译为Linux中的共享库,并且一切运行都很好。我想将此移植到Windows DLL。自1990年代以来,我还没有对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
Run Code Online (Sandbox Code Playgroud)
不知道为什么或是否需要所有这些库,因为我根本没有在库中进行任何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
Run Code Online (Sandbox Code Playgroud)
如果程序“ test004”没有从DLL调用任何功能,则可以正常工作。一旦取消注释任何从库中调用任何函数的行,它就会静默失败,甚至不会进入main()。gdb没有给出堆栈跟踪,但是说:
During startup program exited with code 0xc0000135.
Run Code Online (Sandbox Code Playgroud)
谷歌搜索并没有发现任何有用的信息。请注意:
任何指向正确方向的指针都将有所帮助,包括仅将我指向并非过时且不适用于C ++的文档。
您可以在https://github.com/brechtsanders/ci-test找到 C 语言库的最小示例,其中说明了如何使用 Makefile 和 CMake,并且代码是跨平台的(相同的代码也可以在 Linux 和苹果系统)
| 归档时间: |
|
| 查看次数: |
6808 次 |
| 最近记录: |