使用 Oracle OCI.dll 与 Mingw64 64 位编译器

use oracle oci.dll with mingw64 64bit compiler

本文关键字:编译器 Mingw64 Oracle OCI dll 使用      更新时间:2023-10-16

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

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

谢谢

马可

我刚刚生成了liboci.a没有任何麻烦。可能你搞砸了什么或使用不正确的方法(dlltool -z ...)。以下是您的操作方法:

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

    • 如果您有通常的MinGW,在此处获取;
    • 如果您有MinGW-w64,请在此处获取。
  2. 运行gendef oci.dll(将生成oci.def);

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

  4. 现在尝试链接到liboci.a.

注意:请确保您的oci.dll面向x86,则dlltool也应来自面向x86的MinGW/MinGW-w64发行版。x64 情况也是如此,即目标架构匹配很重要。

据我所知,这篇文章可能不适用于 64 位系统,但它适用于 32 位 Windows...

我尝试了 GENDEF,但它无法生成 DEF 文件。在开始编写 DLL 时已经为我自己的目的解决了这个问题,我建议使用 TCC 中的 Tiny_impdef.exe,它有效。(TCC = Tiny C Compiler,作者:Fabrice Bellard,后来是Grishka。更重要的是,与DLLTOOL(可能还有GENDEF)不同,无论GCC是否使用-s来剥离输出DLL,它都可以工作!

如果使用 GCC,请使用 DLLTOOL 从 DEF 生成 *.a 库文件。TCC将只使用两个命令行来完成DLL和EXE的整个构建。我有一组命令,允许 GCC 或 TCC 构建 DLL 或 EXE,所有四种可能的组合都可以工作。

下面的批处理文件,用于随意掠夺...我相信它可以更好,但至少它按原样干净地工作。

@ECHO关闭REM 无论哪个编译器制作 DLL 或 EXE,这个系统似乎都可以工作。尝试简化 GCC。

快速帧 TCC 命令。 创建 3 个文件,DLL 和 DEF,然后创建 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.dllREM

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

快速眼动 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.dllE:\CODING\TCC\"Tiny_Impdef.exe" E:\CODING\TCC\EXAMPLES\TEST_DLL\TEST_DLL.DLL> NULE:\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,或者你好和世界......这是 EXE:

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}