Разве стандартная библиотека C ++ не является обратно совместимой? - PullRequest
1 голос
/ 15 марта 2010

Я работаю в 64-битной системе Linux, пытаясь создать некоторый код, который зависит от сторонних библиотек, для которых у меня есть двоичные файлы. Во время компоновки я получаю поток неопределенных ошибок ссылок для одной из библиотек, указывая, что компоновщик не может разрешить ссылки на стандартные функции / классы 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, как и в версии 3.4.9. На этом уровне, разве это не должно быть обратно совместимым? Кажется, что сторонняя библиотека ищет более раннюю версию стандартной библиотеки, чем та, которую я установил; но разве нет обратной совместимости между версиями с одинаковым старшим номером для общей библиотеки? Опять же, я не программист на C ++; но я не вижу, в чем проблема.

Любой совет с благодарностью. Благодарю.

Ответы [ 2 ]

6 голосов
/ 15 марта 2010

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

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

1 голос
/ 15 марта 2010

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

...