据我所知,这篇文章可能不适用于 64 位系统,但它适用于 32 位 Windows...
我尝试了 GENDEF,但无法生成 DEF 文件。在开始编写 DLL 时已经为我自己的目的解决了这个问题,我建议使用来自 TCC 的 Tiny_impdef.exe,它可以工作。(TCC = Tiny C 编译器,由 Fabrice Bellard 和后来的 Grishka 编写。)此外,与 DLLTOOL(可能还有 GENDEF)不同,无论 GCC 是否使用 -s 来剥离输出 DLL,它都可以工作!
如果使用 GCC,则使用 DLLTOOL 从 DEF 生成 *.a 库文件。TCC 将只使用两个命令行来完成 DLL 和 EXE 的整个构建。我有一组命令允许 DLL 或 EXE 由 GCC 或 TCC 构建,所有四种可能的组合都可以工作。
下面的批处理文件,用于随意掠夺......我确信它可以改进,但至少它可以正常工作。
@ECHO 关闭
REM 无论哪个编译器生成 DLL 或 EXE,这个系统似乎都可以工作。尝试为 GCC 简化。
REM TCC 命令。创建 3 个文件,DLL 和 DEF,然后是 EXE。
REM E:\CODING\TCC\TCC.EXE -共享 E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.c -oE:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.dll
REM E:\CODING\TCC\TCC.EXE E:\CODING\TCC\EXAMPLES\Test_DLL\Test_EXE.c E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.def -oE:\CODING\TCC\EXAMPLES\Test_DLL \Test_DLL.exe
REM GCC 命令。警告!还是需要 TCC 的 Tiny_Impdef.exe!
E:\CODING\GCC\BIN\GCC.EXE -s -shared -IE:\CODING\GCC\INCLUDE -mwindows E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.c -oE:\CODING\TCC\EXAMPLES \Test_DLL\Test_DLL.dll
E:\CODING\TCC\"Tiny_Impdef.exe" E:\CODING\TCC\EXAMPLES\TEST_DLL\TEST_DLL.DLL > NUL
E:\CODING\GCC\MINGW32\BIN\DLLTOOL.EXE -d E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.def -lE:\CODING\TCC\EXAMPLES\Test_DLL\libTest_DLL.a
E:\CODING\GCC\BIN\GCC.EXE -s -IE:\CODING\GCC\INCLUDE -mwindows E:\CODING\TCC\EXAMPLES\Test_DLL\Test_EXE.c E:\CODING\TCC\EXAMPLES\Test_DLL\ libTest_DLL.a -oE:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.exe
开始 E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.exe
为了完整起见,这里是测试 DLL 的 C 代码:
#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)
DLL_EXPORT void ZoodleWurdle(){
MessageBox (0, "Wurdle", "Zoodle", MB_ICONINFORMATION);
}
DLL_EXPORT void MangleWurzel(){
MessageBox (0, "Mangled", "Wurzels", MB_ICONINFORMATION);
}
抱歉,Gummidgisms,但我必须从某个地方开始,我从不喜欢 foo 和 bar,或 hello 和 world ......这是 EXE:
#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ZoodleWurdle(); MangleWurzel();
return 0;
}