Я использую бродягу для создания того же кода в нескольких версиях Ubuntu (12.04
, 14.04
и 16.04
).Эта же библиотека определяет разные символы под 16.04 и под 14.04
Под 16.04
, у меня есть недостающий символ:
undefined reference to TiXmlElement::TiXmlElement(std::string const&)
Связь осуществляется с помощью одной и той же версии libtinyxml
(смотри ниже), но когда я смотрю на символы внутри библиотеки, есть небольшая разница :
Ubuntu 14.04:
$ ldd libcustomlib.so
libtinyxml.so.2.6.2 => /usr/lib/x86_64-linux-gnu/libtinyxml.so.2.6.2 (0x00007fe6c9789000)
$ objdump -TC /usr/lib/x86_64-linux-gnu/libtinyxml.so.2.6.2 | grep "TiXmlElement::TiXmlElement(std"
000000000000a0f0 g DF .text 0000000000000072 Base TiXmlElement::TiXmlElement(std::string const&)
000000000000a0f0 g DF .text 0000000000000072 Base TiXmlElement::TiXmlElement(std::string const&)
Ubuntu 16.04:
$ ldd libcustomlib.so
libtinyxml.so.2.6.2 => /usr/lib/x86_64-linux-gnu/libtinyxml.so.2.6.2 (0x00007f08eb3c0000)
$ objdump -TC /usr/lib/x86_64-linux-gnu/libtinyxml.so.2.6.2 | grep "TiXmlElement::TiXmlElement(std"
000000000000aad0 g DF .text 0000000000000072 Base TiXmlElement::TiXmlElement(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
000000000000aad0 g DF .text 0000000000000072 Base TiXmlElement::TiXmlElement(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
Как вы можете видеть, под 16.04
, библиотека, кажется, был построен с C++ 11, а не под 14.04
.
Как это так, поскольку номер версии тот же? И что я могу сделать, чтобы скомпилировать мой код?
Является ли обновление вашей инструментальной цепочки опцией? – StoryTeller
Я не уверен, что полностью понял предложение, но большинство наших разработчиков не используют C++ 11, поэтому я не хочу использовать его. – Jav
Мое предложение проистекает из символов, которые вы показали. 'libtinyxml 16.04' построен с использованием другой версии стандартной библиотеки, чем' 14.04'. Поскольку двоичная совместимость здесь не обещана, вам необходимо обновить свою инструментальную цепочку. Кроме того, использование компилятора, который поддерживает C++ 11/14, не означает, что вам нужно начать использовать все новые функции языка. Вы все еще можете написать то, что является довольно законным C++ 03. – StoryTeller