1

我正在尝试将 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 ("dlltool -d oci.def -l liboci.a") 生成导入库 oci.a

但是,我使用 dlltool 生成的 oci.a 库是一个空文件。在其他作品中,我似乎无法生成这个 oci.a 库,我应该用它来将我的程序链接到 oci.dll

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

谢谢

马可

4

2 回答 2

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.

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

于 2013-11-20T13:28:27.987 回答
1

据我所知,这篇文章可能不适用于 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;
}
于 2016-11-05T00:11:22.117 回答