Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将oracle oci.dll与mingw64位编译器一起使用_C++_Oracle_Dll_Oracle Call Interface_Mingw W64 - Fatal编程技术网

C++ 将oracle oci.dll与mingw64位编译器一起使用

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)

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

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

多谢各位


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;
    }