使用oracle oci.dll和mingw64 64bit编译器

时间:2013-11-08 00:05:26

标签: c++ oracle dll oci mingw-w64

我正在尝试使用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

有人知道如何解决这个问题吗? 有人能够正确执行此任务吗?

谢谢

2 个答案:

答案 0 :(得分:2)

我刚刚生成liboci.a没有任何麻烦。可能你搞砸了一些东西或使用了不正确的方法(dlltool -z ...)。这是你如何做到的:

  1. 下载并安装(可以从源代码构建)gendef实用程序:

  2. 运行gendef oci.dll(将生成oci.def);

  3. 运行dlltool -D oci.dll -d oci.def -l liboci.a(将生成liboci.a);

  4. 现在尝试链接liboci.a

  5. 注意:请确保如果您的oci.dll定位到x86,那么dlltool应来自定位x86的MinGW / MinGW-w64发行版好。对于x64情况也是如此,即目标架构匹配很重要。

答案 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.

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

为了完整性,这是测试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,或者你好和世界......这是EXE:

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}