我正在尝试使用oracle oci库和编译器mingw64。 如果我链接oracle提供的oci.lib,我的64位程序崩溃,因为显然mingw64不支持使用vc创建的dll进行链接。
解决方法似乎是:
1)从oci.dll生成一个def文件,我正在使用mingw64 gendef(如果我使用这个命令“dlltool -z oci.def --export-all-symbol oci.dll”我得到一个空的def文件,如果我使用gendef我得到一个填充的def文件)
2)使用dlltool生成导入库oci.a(“dlltool -d oci.def -l liboci.a”)
但是我使用dlltool生成的oci.a库是一个空文件。在其他作品中似乎我无法生成这个oci.a库,我应该用它将我的程序链接到oci.dll
有人知道如何解决这个问题吗? 有人能够正确执行此任务吗?
谢谢
马
答案 0 :(得分:2)
我刚刚生成liboci.a
没有任何麻烦。可能你搞砸了一些东西或使用了不正确的方法(dlltool -z ...
)。这是你如何做到的:
答案 1 :(得分:0)
这篇文章可能不适用于我所知道的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的整个构建。我有一组命令允许由GCC或TCC构建DLL或EXE,所有四种可能的组合都可以工作。
下面的批处理文件,随意掠夺...我敢肯定它可以更好,但至少它干净利落。
@ECHO OFF REM This system seems to work regardless of which compiler makes the DLL or the EXE. Try to simplify for GCC.为了完整性,这是测试DLL的C代码:REM TCC COMMANDS. Creates 3 files, DLL and DEF, then EXE. REM E:\CODING\TCC\TCC.EXE -shared 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 COMMANDS. WARNING! Still needs TCC's 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
START E:\CODING\TCC\EXAMPLES\Test_DLL\Test_DLL.exe
#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,或者你好和世界......这是EXE:
#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ZoodleWurdle(); MangleWurzel();
return 0;
}