最近我把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 AttrId)
我使用Centos 6.6和最新的OCCI版本instantclient-basiclite-linux.x64-12.1.0.2.0.
任何想法?
谢谢,大卫。
这几乎可以肯定是由于gcc 5中的新ABI与OCCI库所期望的ABI不兼容。
- OCCI库显然是使用gcc 4.x创建的
- gcc 5引入了一个新的ABI,其中包括std::string的"短字符串优化",并且与c++ 11兼容(它不允许在gcc 4.x中使用的std::string的引用计数实现)。
您可以在构建代码之前尝试# define _GLIBCXX_USE_CXX11_ABI为0,这将导致gcc 5使用旧的ABI。
- 注意,所有东西都必须使用相同的ABI来编译才能一起工作,所以你可能想要设置一个全局构建标志。(例如,使用CMake,您可以在CMake命令行中添加-DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0")。
另外,请注意,当尝试使用clang及其libc++实现使用OCCI进行构建时,也存在类似的问题(http://libcxx.llvm.org/)。(这就是咬我的那只)。
您可以在https://gcc.gnu.org/gcc-5/changes.html#libstdcxx和https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html找到更多信息
我在Solaris 11中遇到了类似的问题。链接器选项解决了这个问题:
- m64 -lCstd