与gcc 5的OCCI链接错误

时间:2015-08-31 10:20:47

标签: linux c++11 gcc occi

最近我将我的gcc从4.1.2升级到5.2.0。

这导致与OCCI库的链接错误:

源代码I尝试运行:

#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 attrid)

我使用的是Centos 6.6和最新的OCCI版本instantclient-basiclite-linux.x64-12.1.0.2.0。

有什么想法吗?

谢谢, 大卫

2 个答案:

答案 0 :(得分:4)

这几乎可以肯定是由于gcc 5中的新ABI与OCCI库预期的ABI之间不兼容。

  • OCCI库显然是使用gcc 4.x
  • 创建的
  • gcc 5引入了一个新的ABI,其中包括std :: string的“短字符串优化”,并且与C ++ 11兼容(不允许使用std :: string的引用计数实现)在gcc 4.x)。

您可以在构建代码之前尝试#defining _GLIBCXX_USE_CXX11_ABI为0,这将导致gcc 5使用旧的ABI。

  • 请注意,必须使用相同的ABI编译EVERYTHING才能协同工作,因此您可能希望将该设置设置为全局构建标志。 (例如,使用CMake,您可以将-DCMAKE_CXX_FLAGS =“ - D_GLIBCXX_USE_CXX11_ABI = 0”添加到CMake命令行)。

另外,请注意,尝试使用OCCI和clang及其libc ++(http://libcxx.llvm.org/)的实现进行构建时存在类似的问题。 (这是咬我的那个。)

您可以在https://gcc.gnu.org/gcc-5/changes.html#libstdcxxhttps://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

了解更多信息

答案 1 :(得分:0)

我在Solaris 11中遇到了类似的问题。 它已通过链接器选项解决:

-m64 -lCstd

我希望它有所帮助。