Неопределенный символ в Poco C++

Ранее я скомпилировал простую программу командной строки, которая использовала Poco C++ (который, кстати, мне очень нравится). Программа отлично работала несколько месяцев.

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

dyld: Symbol not found: __ZN4Poco4Util11Application12handleOptionERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESA_
  Referenced from: /Users/me/bin/sqlmerge
  Expected in: /usr/local/opt/poco/lib/libPocoUtil.16.dylib
 in /Users/me/bin/sqlmerge

Может кто-нибудь сказать мне, почему это происходит? Я скомпилировал с Poco 1.4.6 и запустил с Poco 1.4.6, хотя по какой-то причине Poco отсутствовал на моем компьютере, и мне пришлось переустанавливать с brew install poco (очевидно, я запускаю это на Mac).

EDIT: я не уверен в причине, но переустановка с включенной опцией --c++11 устраняет проблему. Например.:

brew install poco --c++11

Возможно, изменение имени С++ немного отличается от более старых версий стандарта С++ до С++ 11?


person magnus    schedule 21.07.2014    source источник


Ответы (1)


C++ не имеет бинарного интерфейса приложений. Это приводит к большому количеству головной боли, в том числе заставляет людей перекомпилировать, если они обновляют версии компилятора. Тот же компилятор, другая версия, другое искажение имен. Вот почему большинство библиотек имеют интерфейс C... по историческим причинам интерфейс C имеет стабильное искажение имен на всех известных платформах.

http://morpher.com/documentation/articles/abi/ Список проблем C++ ABI

Херб Саттер предложил стабильную платформу ABI для C++. Так что помощь уже в пути :-)

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf

person Caladain    schedule 30.07.2014