0

我正在尝试使用 gcc 7.1 使用 OCCI(版本 11、12、18,都导致下面解释的相同问题)创建一个 C++ 应用程序。

下面的应用程序在 RHEL7 下使用 gcc 4.8.5 编译并运行良好,但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 库?

4

2 回答 2

0

在第一个包含之前添加以下行。GCC 使用“std::__cxx11::string”,但英特尔编译器使用“”std::string,因此您会得到不同的结构和奇怪的错误。

# define _GLIBCXX_USE_CXX11_ABI 0
于 2021-09-10T21:09:52.490 回答
0

我遇到了同样的问题。OCCI 使用旧的 ABI,尽管 GCC-5.0 以后更改了默认 ABI。但是这些 GCC 编译器提供了双 ABI(旧的和新的),只是我们必须声明使用哪一个。因此,要么将以下行添加为代码的第一行

# define _GLIBCXX_USE_CXX11_ABI 0

或将以下宏添加到编译器命令行

_GLIBCXX_USE_CXX11_ABI=0

真正的问题是,如果我们使用来自多个供应商的库,其中一些提供默认 ABI,那么它们将无法与旧 ABI 一起使用。而且我还没有找到任何解决这个问题的方法。

于 2021-09-23T06:26:58.860 回答