我一直在使用Oracle数据库访问和C / C ++解决方案。
我正在使用OCCI,但在Solaris 11中进行链接时遇到麻烦。
该解决方案在Linux(OpenSUSE和Mint)中的工作原理像“魅力”,但在Solaris 11中却没有。
这里的环境信息:
我下载了Instantclient_11_2(Sun sparc版本)并将其解压缩到Solaris文件夹中
我创建了指向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 4月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 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 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
我创建了另一个文件夹,该文件夹包含从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构建的。
您不能使用CC
链接使用g++
内置代码的可执行文件,除非可以某种方式强制g++
链接C ++运行时库libCrun.so
和libCstd.so
以及正确的C ++运行-time启动代码,与Solaris Studio的CC
相同。这可能不是没有可能,但是直接调用ld
并自己链接二进制文件会更容易。
而且,您无法使用g++
编译C ++源代码来匹配Solaris Studio CC
所使用的名称处理方案。 (除非代码是使用CC
的更高版本构建的,并且它使用命令行参数来生成g++
兼容的名称转换以及许多其他兼容性要求,而根据我的经验,这些都是OCCI
从未实现过的。 )
简而言之,您需要使用Solaris Studio的CC
编译器在Solaris上使用OCCI。