【问题标题】:Compatibility issues with Oracle OCCI and g++ 7.1Oracle OCCI 和 g++ 7.1 的兼容性问题
【发布时间】:2018-08-29 08:31:58
【问题描述】:

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

下面的应用程序在 RHEL7 下使用 gcc 4.8.5 编译并运行良好,但在使用 gcc 7.1 编译时抛出错误 ORA-24960: the attribute OCI_ATTR_USERNAME is greater than the maximum allowable length of 255

This question 似乎解决了这个问题,但在我的情况下,降级到较低的编译器版本不是选项,因为我需要将 OCCI 调用集成到依赖 gcc 7.1 的更大应用程序中。

这是一个 MCVE,用于简单地检查与 DB 的连接:

#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 库?

【问题讨论】:

  • 我尽量避免使用 OCCI,g++ ABI 会不时更改,并且没有任何力量会迫使 Oracle 使用更新的编译器重新编译 OCCI。任何开源 OCI 包装器都比 OCCI 更好。例如,最近已经发生过,由于 ABI 不兼容,从 OCCI 引发的异常无法在使用较新的 g++ 编译的代码中捕获。抛出异常时,应用程序始终会出现段错误。
  • "Certified Compilers for OCCI (Doc ID 437957.1)" support doc 有关于兼容性的信息 - 基本上只有(默认?)支持的 Linux 发行版附带的编译器。正如 ibre 所说,如果需要,您可能最好使用 C 接口和其他包装器。
  • 您使用的是哪个 g++ 7.1 - 软件包来自哪里?

标签: c++ oracle g++ occi oracle18c


【解决方案1】:

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

# define _GLIBCXX_USE_CXX11_ABI 0

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

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

# define _GLIBCXX_USE_CXX11_ABI 0

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

_GLIBCXX_USE_CXX11_ABI=0

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

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多