簡體   English   中英

OCCI鏈接:未定義的符號

[英]OCCI linkage: Undefined symbols

我一直在使用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。 下面是顯示文件的“ ls -l”:

    • -rwxrwxr-x 1 f780333 desenv 23792 2013年8月22日adrci
    • -rw-rw-r-- 1 f780333 desenv 414 2013年8月22日BASIC_README
    • -rwxrwxr-x 1 f780333 desenv 41464 2013年8月22日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 2013年8月22日libnnz11.so
    • lrwxrwxrwx 1 f780333 desenv 5 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 2013年8月22日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 2013年8月22日xstreams.jar
  3. 我創建了另一個文件夾,該文件夾包含從Solaris到重要需求庫的符號鏈接。我正在將項目與選項-m64 -lCstd -lrt -lsocket鏈接起來。 m64強制64位,這是必要的。 由於Cstd,rt和socket是間接使用這些庫的事實。

  4. 我正在使用Netbeans並在Solaris 11中進行遠程編譯

編譯正常。 編譯命令模式如下所示:

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.od” -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 / includeInstantclient 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

最后是鏈接器錯誤消息

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

我為這個問題而瘋狂,任何幫助將不勝枚舉。

以我的經驗,OCCI始終是使用Solaris Studio編譯器為Solaris構建的。

您不能使用g++ 鏈接使用CC內置代碼的可執行文件,除非您能以某種方式強制g++鏈接C ++運行時庫libCrun.solibCstd.so以及正確的C ++運行時啟動代碼,與Solaris Studio的CC相同。 這可能不是不可能,但是直接調用ld並自己鏈接二進制文件會更容易。

而且,您無法使用g++ 編譯 C ++源代碼來匹配Solaris Studio CC所使用的名稱處理方案。 (除非代碼是使用更高版本的CC構建的, 並且它使用命令行參數來生成g++兼容的名稱修飾以及許多其他兼容性要求,而根據我的經驗, OCCI從來沒有...)

簡而言之,您需要使用Solaris Studio的CC編譯器在Solaris上使用OCCI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM