Я работал над решением с доступом к базе данных 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
/ Главная / f780333 / paineldaemon / Библиотека / indra_clib / включить папка со статической библиотекой, используемой программой Эта библиотека моя и нужна для проекта.
/ Главная / f780333 / paineldaemon / Библиотека / instantclient_11_2 / SDK / включить это папка из InstantClient SDK, которая включает в себя * .h из OCCI.
Но когда начинается процесс сцепления, начинается и вся головная боль:
(первая) команда связывания:
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 с использованием компилятора Solaris Studio.
Ты не можешь ссылка на сайт исполняемый файл, который использует CC
-встроенный код с использованием g++
, если вы не можете как-то принуждать g++
связать в обеих библиотеках времени выполнения C ++ libCrun.so
а также libCstd.so
наряду с правильным кодом запуска C ++, таким же, как в Solaris Studio CC
делает. Это, вероятно, не невозможно, но было бы проще просто вызвать ld
непосредственно и связать двоичный файл самостоятельно.
И ты не можешь компилировать Исходный код C ++ с g++
чтобы соответствовать схеме искажения имени, используемой Solaris Studio CC
, (если код не был построен с более поздней версией CC
а также он использовал аргументы командной строки для создания g++
совместимость имен, среди многих других требований совместимости, которые по моему опыту OCCI
никогда не был …)
Короче говоря, вам нужно использовать Solaris Studio CC
компилятор для использования OCCI на Solaris.
Других решений пока нет …