1

最近、gcc を 4.1.2 から 5.2.0 にアップグレードしました。

これにより、OCCI ライブラリとのリンケージ エラーが発生しました。

実行しようとしているソースコード:

#include <iostream>
#include <occi.h>
using namespace oracle::occi;
using namespace std;

int main (int argc, char *argv[])
{    
  Environment *env;
  Connection *conn;

  oracle::occi::MetaData metaData = conn->getMetaData ((char *)"PERSON_OBJ");
  metaData.getString(MetaData::ATTR_NAME); 

  return(0);
}

リンケージ エラー:

gmake -f /home/davidd/temp.mak CFG=Debug 
g++  -g "-Wl,-rpath,/omniqdir/arch/x86_64/release/lib:/omniqdir/instantclient_12_1:/usr/lib,-rpath-link,/omniqdir/arch/x86_64/release/lib:/omniqdir/instantclient_12_1:/usr/lib,-ldl,-lpthread" /omniqdir/arch/x86_64/release/lib/libjemalloc.so -o "Debug/temp" Debug/temp.o /omniqdir/instantclient_12_1/libocci.so /omniqdir/instantclient_12_1/libclntsh.so 
Debug/temp.o: In function `main':
temp.cpp:(.text+0xac): undefined reference to `_ZNK6oracle4occi8MetaData9getStringB5**cxx11**ENS1_6AttrIdE'
collect2: error: ld returned 1 exit status
gmake: *** [Debug/temp] Error 1

未定義の参照に c++11 関連のシンボルが含まれていることに気付きました。これは、使用している新しい gcc コンパイラに関係していると思われます。

occiControl.h からの関数宣言

OCCI_STD_NAMESPACE::string getString(MetaData::AttrId属性)

Centos 6.6 と最新の OCCI バージョンの instantclient-basiclite-linux.x64-12.1.0.2.0 を使用しています。

何か案は?

ありがとう、デビッド

4

2 に答える 2

5

これは、ほぼ確実に、gcc 5 の新しい ABI と OCCI ライブラリが期待する ABI との間の非互換性が原因です。

  • OCCI ライブラリは明らかに gcc 4.x を使用して作成されました
  • gcc 5 は、特に std::string の「短い文字列の最適化」を含む新しい ABI を導入し、C++11 と互換性があります (gcc 4 で使用される std::string の参照カウント実装を許可しません)。 。バツ)。

コードをビルドする前に _GLIBCXX_USE_CXX11_ABI を 0 に #defining してみると、gcc 5 が古い ABI を使用するようになります。

  • 連携するには、すべてを同じ ABI でコンパイルする必要があることに注意してください。そのため、その設定をグローバル ビルド フラグにすることをお勧めします。(たとえば、CMake では、-DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" を CMake コマンド ラインに追加します)。

また、clang とその libc++ の実装 ( http://libcxx.llvm.org/ ) で OCCI を使用してビルドしようとすると、同様の問題が存在することに注意してください。(これは私を噛んだものです)。

詳細については、https : //gcc.gnu.org/gcc-5/changes.html#libstdcxxおよびhttps://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.htmlをご覧ください。

于 2015-11-22T16:16:31.453 に答える