2010-03-15 8 views
1

Я работаю над 64-битной системой Linux, пытаясь создать какой-то код, который зависит от сторонних библиотек, для которых у меня есть двоичные файлы. Во время компоновки, я получаю поток неопределенных ссылочных ошибок для одной из библиотек, указывая, что линкер не может разрешить ссылки на стандартный C++ функций/классов, например:Не совместима ли стандартная библиотека C++ с обратной совместимостью?

librxio.a(EphReader.o): In function `gpstk::EphReader::read_fic_data(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': 
EphReader.cpp:(.text+0x27c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)' 
EphReader.cpp:(.text+0x4e8): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)' 

Я на самом деле не C++ программист , но это выглядит так, как будто он не может найти стандартную библиотеку. Делая некоторые дополнительные исследования, я получил следующее, когда я посмотрел на зависимости librxio для стандартной библиотеки:

$ ldd librxio.so.16.0 
./librxio.so.16.0: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./librxio.so.16.0) 
    libm.so.6 => /lib64/libm.so.6 (0x00002aaaaad45000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002aaaaafc8000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002aaaab2c8000) 
    libc.so.6 => /lib64/libc.so.6 (0x00002aaaab4d7000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000555555554000) 

Так что я прочитал, что, как говорят, что librxio (одна из сторонних библиотек) требует, по крайней мере v3.4.9 стандартной библиотеки. Но версия, которую я установил, - 4.1.2:

$ rpm -qa | grep libstdc 
compat-libstdc++-33-3.2.3-61.x86_64 
libstdc++-devel-4.1.2-14.el5.i386 
libstdc++-devel-4.1.2-14.el5.x86_64 
libstdc++-4.1.2-14.el5.x86_64 
libstdc++-4.1.2-14.el5.i386 

Не должно ли это работать? Основное число общего объекта - 6, то же, что и для v3.4.9. На этом уровне, не должно ли это быть обратно совместимым? Похоже, что сторонняя библиотека ищет более раннюю версию стандартной библиотеки, чем то, что я установил; но нет ли обратной совместимости между версиями с тем же самым основным номером для разделяемой библиотеки? Опять же, я не программист на C++; но я не понимаю, в чем проблема.

Любые советы очень ценятся. Благодарю.

+0

Я успешно решил свою практическую проблему - не имея возможности построить родительскую программу - создав стороннюю библиотеку из источника. Спасибо людям. –

ответ

6

C++ runtimes, как правило, специфичны для компилятора, и библиотека, которую вы ищете, определенно является спецификой для компилятора. Имейте в виду, что даже если интерфейс не изменяется, внутренние устройства могут.

Вам потребуется либо приобрести библиотеки, созданные с использованием того же самого компилятора &, что и у вас, или установить соответствующие версии компилятора/библиотеки.

+0

+1 и обратите внимание, что, особенно, поскольку основной номер версии библиотеки изменился, вы ожидаете, что, возможно, будут внесены изменения. –

+0

Но как 3.4.9, так и 4.1.2 имеют SO-число 6. Не означает ли это совместимость с интерфейсом? Или я туда? –

+0

Когда новые символы добавляются, они переходят к вновь созданным интерфейсам, поэтому программа, связанная с новой версией, может ясно показать, что для нее нужен интерфейс, который существует только в новой версии (в вашем случае, в интерфейсе GLIBCXX_3.4.9). Программа, связанная со старой библиотекой, будет продолжать работать со всеми новыми версиями с тем же именем. – wRAR

1

Где вы нашли librxio.so.16.0? Я думаю, что он скомпилирован с GCC> 4.1, и поэтому он может не работать с 4.1 runtime.

+0

Это часть пакета GPSTk; у них имелся бинарный dl x86-64. На этом этапе я проверяю, не проще ли простое создание их библиотек из исходного кода с помощью компилятора и библиотек, которые у меня есть. –