OCCI链接:未定义的符号

时间:2018-04-09 15:11:48

标签: c++ oracle solaris sparc occi

我一直在使用Oracle数据库访问和C / C ++的解决方案。 我使用的是OCCI,但我们在Solaris 11中无法链接。 解决方案的工作原理"就像一个魅力"在Linux(OpenSUSE和Mint)中,但在Solaris 11中没有。

此处环境信息:

  1. 我下载了instantclient_11_2(sun sparc版本)并将其解压缩到Solaris文件夹中
  2. 我创建了libclntsh.so.11.1的符号链接,名为libclntsh.so,libocci.so.11.1名为libocci.so。贝娄a" ls -l"显示文件:

    • -rwxrwxr-x 1 f780333 desenv 23792 2013年8月22日adrci
    • -rw-rw-r-- 1 f780333 desenv 414 Aug 22 2013 BASIC_README
    • -rwxrwxr-x 1 f780333 desenv 41464 Aug 22 2013 genezi
    • lrwxrwxrwx 1 f780333 desenv 17 Apr 5 14:21 libclntsh.so - > libclntsh.so.11.1
    • -rwxrwxr-x 1 f780333 desenv 50268448 2013年8月22日 libclntsh.so.11.1
    • -r-xr-xr-x 1 f780333 desenv 8653320 Aug 22 2013 libnnz11.so
    • lrwxrwxrwx 1 f780333 desenv 15 Apr 5 14:22 libocci.so - > libocci.so.11.1
    • -rwxrwxr-x 1 f780333 desenv 1545008 2013年8月22日 libocci.so.11.1
    • -rwxrwxr-x 1 f780333 desenv 118735824 2013年8月22日libociei.so
    • -r-xr-xr-x 1 f780333 desenv 121800 Aug 22 2013 libocijdbc11.so
    • -r - r - r-- 1 f780333 desenv 2091135 2013年8月22日ojdbc5.jar
    • -r - r - r-- 1 f780333 desenv 2739616 2013年8月22日ojdbc6.jar
    • drwxrwxr-x 4 f780333 desenv 2013年8月22日sdk
    • -rwxrwxr-x 1 f780333 desenv 177680 2013年8月22日uidrvci
    • -rw-rw-r-- 1 f780333 desenv 66779 Aug 22 2013 xstreams.jar
  3. 我创建了另一个文件夹,用于跟踪Solaris中重要需求库的符号链接。我将项目与选项-m64 -lCstd -lrt -lsocket连接起来。 m64强制64位,这是必要的。 Cstd,rt和socket是因为这些库是间接使用的。

  4. 我正在使用Netbeans并在Solaris 11中远程编译

  5. 编译工作正常。 编译命令模式如下所示:

    g ++ -m64 -c -g -I / home / f780333 / paineldaemon / lib / indra_clib / include -I / home / f780333 / paineldaemon / lib / instantclient_11_2 / sdk / include -std = c ++ 98 -MMD - MP -MF" build / Debug / GNU-Solaris-Sparc / main.o.d" -o build / Debug / GNU-Solaris-Sparc / main.o main.cpp

    / home / f780333 / paineldaemon / lib / indra_clib / include 是一个包含程序使用的静态库的文件夹。这个库是我的,是项目所必需的。

    / home / f780333 / paineldaemon / lib / instantclient_11_2 / sdk / include 是来自instantclient sdk的文件夹,其中包含来自OCCI的* .h。

    但是当联系过程开始时,所有头痛也开始了:

    (第一)链接命令:

    g++ -o <all files here> -L/home/f780333/paineldaemon/lib/sun -L/home/f780333/paineldaemon/lib -L/home/f780333/paineldaemon/lib/instantclient_11_2 -R'/home/f780333/paineldaemon/lib/sun' -R'/home/f780333/paineldaemon/lib' -R'/home/f780333/paineldaemon/lib/instantclient_11_2' -lclntsh -locci /home/f780333/paineldaemon/lib/libindra_clib.a -m64 -lCstd -lrt -lsocket
    

    最后链接器 ERROR MESSAGE

    Undefined           first referenced
      symbol                in file
    oracle::occi::Date::~Date()         build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Date::Date()          build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Number::operator=(oracle::occi::Number const&) build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Number::Number(double) build/Debug/GNU-Solaris-Sparc/MessageBuilder.o
    oracle::occi::Number::Number(long)  build/Debug/GNU-Solaris-Sparc/MessageBuilder.o
    oracle::occi::Number::Number()      build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Number::~Number()     build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void* (*)(void*, unsigned long), void* (*)(void*, void*, unsigned long), void (*)(void*, void*)) build/Debug/GNU-Solaris-Sparc/DatabaseOperation.o
    oracle::occi::Date::operator=(oracle::occi::Date const&) build/Debug/GNU-Solaris-Sparc/MessageBuilderATM.o
    oracle::occi::Environment::terminateEnvironment(oracle::occi::Environment*) build/Debug/GNU-Solaris-Sparc/DatabaseOperation.o
    oracle::occi::Date::Date(oracle::occi::Environment const*, int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) build/Debug/GNU-Solaris-Sparc/MessageBuilder.o
    ld: fatal: symbol referencing errors
    collect2: error: ld returned 1 exit status
    gmake[2]: *** [dist/Debug/GNU-Solaris-Sparc/paineldaemon] Error 1
    gmake[2]: Leaving directory `/home/f780333/.netbeans/remote/172.16.160.172/sylvia-Linux-x86_64/home/eduardo/Indra/Cartoes/repo/paineldaemon'
    gmake[1]: *** [.build-conf] Error 2
    gmake[1]: Leaving directory `/home/f780333/.netbeans/remote/172.16.160.172/sylvia-Linux-x86_64/home/eduardo/Indra/Cartoes/repo/paineldaemon'
    gmake: *** [.build-impl] Error 2
    

    我对这个问题感到很疯狂,任何帮助都会非常令人沮丧。

1 个答案:

答案 0 :(得分:2)

根据我的经验,OCCI一直是使用Solaris Studio编译器为Solaris构建的。

您无法链接使用CC使用g++构建的代码的可执行文件,除非您能以某种方式强制g++链接两者C ++运行时库libCrun.solibCstd.so以及正确的C ++运行时启动代码,与Solaris Studio CC相同。这可能并非不可能,但直接调用ld并自己链接二进制文件会更容易。

您无法使用g++ 编译 C ++源代码,以匹配Solaris Studio CC使用的名称修改方案。 (除非代码是使用更高版本的CC 构建的,否则它使用命令行参数来生成g++ - 兼容的名称修改,以及许多其他兼容性要求,根据我的经验OCCI从来没有......)

简而言之,您需要使用Solaris Studio的CC编译器在Solaris上使用OCCI。