最近我将我的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。
有什么想法吗?
谢谢, 大卫
答案 0 :(得分:4)
这几乎可以肯定是由于gcc 5中的新ABI与OCCI库预期的ABI之间不兼容。
您可以在构建代码之前尝试#defining _GLIBCXX_USE_CXX11_ABI为0,这将导致gcc 5使用旧的ABI。
另外,请注意,尝试使用OCCI和clang及其libc ++(http://libcxx.llvm.org/)的实现进行构建时存在类似的问题。 (这是咬我的那个。)
您可以在https://gcc.gnu.org/gcc-5/changes.html#libstdcxx和https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
了解更多信息答案 1 :(得分:0)
我在Solaris 11中遇到了类似的问题。 它已通过链接器选项解决:
-m64 -lCstd
我希望它有所帮助。