2015-08-31 5 views
0

Недавно я обновил свой gcc с 4.1.2 до 5.2.0.Ошибка связи OCCI с gcc 5

Это вызвало ошибку сцепления с библиотекой 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/арка/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: В функции main': temp.cpp:(.text+0xac): undefined reference to _ZNK6oracle4occi8MetaData9getStringB5 cxx11 ENS1_6AttrIdE» collect2: ошибка: л.д. возвращается 1 выход статус gmake: *** [Debug/темп] ошибка 1

Я заметил, что неопределенная ссылка содержит C++ 11 связанных символов, которые, я думаю, связаны с новым компилятором gcc, который я использую.

Объявление функции от occiControl.h

OCCI_STD_NAMESPACE :: строка GetString (MetaData :: AttrId attrid)

Я использую Centos 6.6 и последняя версия OCCI instantclient-basiclite-linux.x64- 12.1.0.2.0.

Любые идеи?

Спасибо, David

ответ

3

Это почти наверняка из-за несовместимости между новым ABI в ССЗЕ 5 и ABI ожидаемой библиотек OCCI.

  • библиотеки OCCI, по-видимому создана с использованием GCC 4.x
  • НКУ 5 вводит новый ABI, который включает в себя, среди прочего, «короткий оптимизации строки» для станд :: строки, и совместим с C++ 11 (что запрещает стандартную реализацию std :: string, используемой в gcc 4.x).

Вы можете попробовать #defining _GLIBCXX_USE_CXX11_ABI до 0, прежде чем создавать свой код, что приведет к тому, что gcc 5 будет использовать старый ABI.

  • Обратите внимание, что ВСЕ должно быть скомпилировано с одним и тем же ABI для совместной работы, поэтому вы можете захотеть установить этот глобальный флаг сборки. (Например, с помощью 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#libstdcxx и https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

Смежные вопросы