Программа (inkscape) связана с libpng16, но загружает libpng15 во время выполнения. Почему? - PullRequest
0 голосов
/ 02 марта 2019

Я скомпилировал inkscape с libpng16.Тем не менее, ldd показывает, что требуется libpng15.Поэтому я подозревал, что виновником будет одна из связанных библиотек.Я написал программу, которая рекурсивно ldd - все библиотеки, и ни одна из них, похоже, не нуждается в libpng15.

  • Почему inkscape требует libpng15 и libpng16 сам по себе?
  • Inkscape работает нормально, пока я не попытаюсь экспортировать изображение в формате PNG, затем появится сообщение:

    libpng предупреждение: приложение, созданное с помощью libpng-1.6.16, но работает с 1.5.13

Примечание: я обнаружил lddtree.sh , который, кажется, делает то же самое, и да, результат тот жекак сценарий я написал!

1 Ответ

0 голосов
/ 03 марта 2019

Ну, этот вопрос занял много времени.Я, конечно, не эксперт в тонкостях gcc, g++, статических и динамических линковок и т. Д., Что, вероятно, и является причиной путаницы.

Что здесь произошло?Кажется, что Inkscape использует два типа библиотек.Обычные внешние библиотеки (которые могут контролироваться --enable-static и -shared, но также дюжина или около того внутренних библиотек (некоторые из которых являются частными копиями внешних библиотек, таких как libcroco), которые не контролируются --enable-static и друзья, но запрашивают библиотеки самостоятельно:

libcroco/libcroco.a
libavoid/libavoid.a
libgdl/libgdl.a 
libuemf/libuemf.a
libcola/libcola.a
inkgc/libinkgc.a
libvpsc/libvpsc.a
livarot/libvarot.a
2geom/lib2geom.a
libdepixelize/libdepixelize.a
util/libutil.a 
libinkversion.a 

Кажется, что эти «внутренние» библиотеки всегда статически связаны. Они волшебным образом появляются в последней строке ссылки. Кажется, что их управление не контролируется.совместимость с общими библиотеками, загружаемыми системой automake.

В моем случае libpng15.so был извлечен (вероятно, libcroco, который извлек libgtkmm / libcairomm) внутреннимбиблиотеки, в то время как libpng16.so был запрошен внешними библиотеками, которые я тщательно поддерживаю с libpng16.

Slackware - это Qt -центрический дистрибутив, который поддерживает только минимум GTK мираПоэтому я регулярно пытаюсь обновить эту часть отдельно. На движущейся цели, такой как Slackware-current, это не всегда легко. С другой стороны, все поиски, которые я делал,решить эту проблему показывает достаточно большое количество людей с той же проблемой, большинство из которых не использует -current, или даже Slackware вообще.

Решение, конечно, было перекомпилировать libcairomm, libgtkmm и пару других статических библиотек, затем перекомпилируйте Inkscape.

Оглядываясь назад, простая проверка списка библиотек в команде final link могла бы предупредить о проблеме, показывая две разные версииlibpng включено.С другой стороны, это довольно частный случай, поскольку версии имеют разные имена, но имеют одну и ту же функцию, что довольно уникально.Извините за длинный пост - надеюсь, это поможет другим с подобными проблемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...