Проблемы совместимости с Oracle OCCI и g++ 7.1

Я пытаюсь создать приложение C++ с OCCI (версии 11,12,18, все приводят к одной и той же проблеме, описанной ниже), используя gcc 7.1.

Приложение ниже компилируется и работает нормально с gcc 4.8.5 под RHEL7, но выдает ошибку ORA-24960: the attribute OCI_ATTR_USERNAME is greater than the maximum allowable length of 255 при компиляции с gcc 7.1.

Этот вопрос, кажется, решает проблему, но в моем случае вариант перехода на более низкую версию компилятора не подходит, так как мне нужно интегрировать вызовы OCCI в большее приложение, которое зависит от gcc 7.1.

Вот MCVE для простой проверки соединения с БД:

#include <string>
#include <occi.h>

using namespace oracle::occi;
using namespace std;

int main()
{
  const string url = "//server:1234/ID";
  const string username = "user";
  const string password = "password";

  Environment* env = Environment::createEnvironment();
  try {
    Connection* conn = env->createConnection(username, password, url);
    cout << "Connection to " << url << " successfully established." << endl;

    env->terminateConnection(conn);
    cout << "Connection closed." << endl;
  }
  catch (const SQLException& ex) {
    cerr << "Error: " << ex.what() << endl;
  }
  Environment::terminateEnvironment (env);
}

Кто-нибудь сталкивался с этой проблемой и знает, есть ли обходные пути или статические библиотеки OCCI, на которые я могу ссылаться?

2 ответа

Я столкнулся с той же проблемой. OCCI использует старый ABI, хотя начиная с GCC-5.0 был изменен ABI по умолчанию. Но эти компиляторы GCC предоставляют двойной ABI (как старый, так и новый), только мы должны указать, какой из них использовать. Так что либо добавьте следующую строку в качестве первой строки вашего кода

      # define _GLIBCXX_USE_CXX11_ABI 0

или добавьте следующий макрос в командную строку компилятора

      _GLIBCXX_USE_CXX11_ABI=0

Настоящая проблема заключается в том, что если мы используем библиотеки от нескольких поставщиков, некоторые из которых предоставляют ABI по умолчанию, то они не будут работать со старым ABI. И я пока не нашел решения этой проблемы.

Добавьте строку ниже перед первым включением. GCC использует "std :: __cxx11 :: string", но компилятор Intel использует "" std :: string, поэтому вы получаете другую структуру и странную ошибку.

      # define _GLIBCXX_USE_CXX11_ABI 0
Другие вопросы по тегам