[英]OCCI linkage: Undefined symbols
我一直在使用Oracle數據庫訪問和C / C ++解決方案。 我正在使用OCCI,但是在Solaris 11中進行鏈接時遇到了麻煩。解決方案在Linux(OpenSUSE和Mint)中的運行方式像“魅力”,但在Solaris 11中卻沒有。
這里的環境信息:
我創建了指向libclntsh.so.11.1的符號鏈接,稱為libclntsh.so,並為libocci.so.11.1創建了符號鏈接,稱為libocci.so。 下面是顯示文件的“ ls -l”:
我創建了另一個文件夾,該文件夾包含從Solaris到重要需求庫的符號鏈接。我正在將項目與選項-m64 -lCstd -lrt -lsocket鏈接起來。 m64強制64位,這是必要的。 由於Cstd,rt和socket是間接使用這些庫的事實。
我正在使用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 / 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
最后是鏈接器錯誤消息 :
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.so
和libCstd.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.