我一直在使用Oracle数据库访问和C / C ++的解决方案。 我使用的是OCCI,但我们在Solaris 11中无法链接。 解决方案的工作原理"就像一个魅力"在Linux(OpenSUSE和Mint)中,但在Solaris 11中没有。
此处环境信息:
我创建了libclntsh.so.11.1的符号链接,名为libclntsh.so,libocci.so.11.1名为libocci.so。贝娄a" 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.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
我对这个问题感到很疯狂,任何帮助都会非常令人沮丧。
答案 0 :(得分:2)
根据我的经验,OCCI一直是使用Solaris Studio编译器为Solaris构建的。
您无法链接使用CC
使用g++
构建的代码的可执行文件,除非您能以某种方式强制g++
链接两者C ++运行时库libCrun.so
和libCstd.so
以及正确的C ++运行时启动代码,与Solaris Studio CC
相同。这可能并非不可能,但直接调用ld
并自己链接二进制文件会更容易。
您无法使用g++
编译 C ++源代码,以匹配Solaris Studio CC
使用的名称修改方案。 (除非代码是使用更高版本的CC
和构建的,否则它使用命令行参数来生成g++
- 兼容的名称修改,以及许多其他兼容性要求,根据我的经验OCCI
从来没有......)
简而言之,您需要使用Solaris Studio的CC
编译器在Solaris上使用OCCI。