我一直在使用 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 日
- 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 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 7 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 “构建/调试/GNU-Solaris-Sparc/main.od”-o 构建/调试/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
我对这个问题很着迷,任何帮助都会非常感激。