使用 Oracle OCI.dll 与 Mingw64 64 位编译器
use oracle oci.dll with mingw64 64bit compiler
我正在尝试将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 ...
)。以下是您的操作方法:
-
下载并安装(可以从源代码构建)
gendef
实用程序:- 如果您有通常的MinGW,请在此处获取;
- 如果您有MinGW-w64,请在此处获取。
-
运行
gendef oci.dll
(将生成oci.def
); -
运行
dlltool -D oci.dll -d oci.def -l liboci.a
(将生成liboci.a
); -
现在尝试链接到
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。为完整起见,下面是测试 DLL 的 C 代码:快速帧 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
#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;
}
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 使用 Oracle OCI.dll 与 Mingw64 64 位编译器