C++ 将oracle oci.dll与mingw64位编译器一起使用
我正在尝试将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 有人知道如何解决这个问题吗? 是否有人能够正确执行此任务 多谢各位C++ 将oracle oci.dll与mingw64位编译器一起使用,c++,oracle,dll,oracle-call-interface,mingw-w64,C++,Oracle,Dll,Oracle Call Interface,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)
Marco我刚刚生成了
liboci.a
,没有任何问题。可能是你把事情搞砸了,或者使用了不正确的方法(dlltool-z…
)。以下是您的操作方法:
gendef
实用程序:
- 如果您有常用的,则获取它李>
- 如果您有,则获取
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编译器,由Fabrice Bellard和后来的Grishka编写)此外,与DLLTOOL(可能还有GENDEF)不同的是,无论GCC是否使用-s剥离输出DLL,它都能工作
如果使用GCC,则使用DLLTOOL从DEF生成*.a库文件。TCC将使用两个命令行完成DLL和EXE的整个构建。我有一组命令,允许DLL或EXE由GCC或TCC构建,并且所有四种可能的组合都可以工作
下面的批处理文件,用于任意掠夺。。。我相信它可以做得更好,但至少它工作得很干净
@回音
REM无论哪个编译器生成DLL或EXE,该系统似乎都能工作。尝试简化GCC
REM TCC命令。创建3个文件,DLL和DEF,然后是EXE。
REM E:\CODING\TCC\TCC.EXE-共享E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.c-oE:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.DLL
REM E:\CODING\TCC\TCC.EXE E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u EXE.c E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.def-oE:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.EXE
remgcc命令。警告仍然需要TCC的Tiny_Impdef.exe!
E:\CODING\GCC\BIN\GCC.EXE-s-shared-IE:\CODING\GCC\INCLUDE-mwindows E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.c-oE:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.DLL
E:\CODING\TCC\“Tiny\u Impdef.exe”E:\CODING\TCC\EXAMPLES\TEST\u DLL\TEST\u DLL.DLL>NUL
E:\CODING\GCC\MINGW32\BIN\DLLTOOL.EXE-d E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.def-lE:\CODING\TCC\EXAMPLES\Test\u DLL\libTest\u DLL.a
E:\CODING\GCC\BIN\GCC.EXE-s-IE:\CODING\GCC\INCLUDE-mwindows E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u EXE.c E:\CODING\TCC\EXAMPLES\Test\u DLL\libTest\u DLL.a-oE:\CODING\TCC\EXAMPLES\Test\u DLL\Test\DLL.EXE
启动E:\CODING\TCC\EXAMPLES\Test\u DLL\Test\u DLL.exe
为完整起见,以下是测试DLL的C代码:
@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\u导出\u declspec(dllexport)
DLL_导出无效ZoodleWurdle(){
MessageBox(0,“Wurdle”,“Zoodle”,MB_图标信息);
}
DLL_导出void mangleurzel(){
消息框(0,“损坏”,“Wurzels”,MB_图标信息);
}
对不起,我有点口香糖,但我必须从某个地方开始,我从来都不喜欢foo和bar,或者hello和world。。。以下是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);
}
#包括
void ZoodleWurdle();
void mangleurzel();
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow){
ZoodleWurdle();MangleWurzel();
返回0;
}
Oracocci12.dll有问题。gendef oraocci12.dll不生成def文件,但有许多错误“decode_ms_name”。因此,我无法将此文件与mingw64链接并获取“对oracle occi::oracle:environment的未定义引用”。有什么想法吗?
#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ZoodleWurdle(); MangleWurzel();
return 0;
}