0

gcc 7.1 を使用して、OCCI で C++ アプリケーションを作成しようとしています (バージョン 11、12、18、すべてが以下で説明する同じ問題につながります)。

以下のアプリケーションは、RHEL7 の下で gcc 4.8.5 を使用して正常にコンパイルおよび実行されますORA-24960: the attribute OCI_ATTR_USERNAME is greater than the maximum allowable length of 255が、gcc 7.1 でコンパイルするとエラーがスローされます。

This questionは問題に対処しているようですが、私の場合、OCCI呼び出しをgcc 7.1に依存するより大きなアプリケーションに統合する必要があるため、コンパイラのバージョンを下げることはできません。

DBへの接続を単純にチェックするための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 ライブラリがあるかどうかを知っていますか?

4

2 に答える 2

0

私は同じ問題に直面しました。GCC-5.0 以降ではデフォルトの ABI が変更されていますが、OCCI は古い ABI を使用します。しかし、これらの GCC コンパイラはデュアル ABI (新旧の両方) を提供するため、どちらを使用するかを宣言する必要があるだけです。したがって、次の行をコードの最初の行として追加します

# define _GLIBCXX_USE_CXX11_ABI 0

または、次のマクロをコンパイラ コマンド ラインに追加します。

_GLIBCXX_USE_CXX11_ABI=0

本当の問題は、複数のベンダーのライブラリを使用し、その一部がデフォルトの ABI を提供している場合、古い ABI では動作しないことです。そして、私はまだこの問題の解決策を見つけていません。

于 2021-09-23T06:26:58.860 に答える