В macOS почему otool -L не показывает версию libpng, с которой работает приложение? - PullRequest
0 голосов
/ 01 мая 2020

Я компилирую приложение , которое использует систему сборки CMake для macOS 10.15.4. Когда я запускаю построенное приложение, я получаю сообщение об ошибке (Application built with libpng-1.5.23 but running with 1.6.37), сообщающее мне, что у меня есть несоответствие между версией libpng, для которой было скомпилировано приложение, и той, которая используется во время работы:

Hostname:sample_data username$ ~/src/github/hoche/splat/build/src/Debug/splat -t ~/src/github/hoche/splat/sample_data/wnju-dt.qth -sdelim _ -L 5 -maxpages 4
.
.
.
Writing Signal Strength map "/Users/username/src/github/hoche/splat/sample_data/wnju-dt.png" (2400x2430 image)... libpng warning: Application built with libpng-1.5.23 but running with 1.6.37
Done!

Я сказал CMake создать файл проекта Xcode для Xcode 11.3. Рассматриваемое приложение использует libpng. Я говорю CMake использовать libpng со следующим предложением в моем CMakeLists.txt:

find_package(PNG REQUIRED)
find_package(JPEG REQUIRED)
find_package(Threads REQUIRED)
include_directories(${PNG_INCLUDE_DIR})
add_executable(splat
    .
    .
    .)
target_link_libraries(splat bz2 ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})

Я установил libpng через MacPorts. Когда я просматриваю строки компоновщика в сгенерированном проекте XCode, они выглядят так:

Xcode linker lines

otool -L отчеты:

Hostname:sample_data username$ otool -L ~/src/github/hoche/splat/build/src/Debug/splat 
/Users/username/src/github/hoche/splat/build/src/Debug/splat:
    /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    /opt/local/lib/libpng16.16.dylib (compatibility version 54.0.0, current version 54.0.0)
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
    /opt/local/lib/libjpeg.9.dylib (compatibility version 13.0.0, current version 13.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)

Если я проверю файлы в месте, указанном в строке компоновщика, они тоже будут отображаться правильно:

HOstname:sample_data username$ ls -al /opt/local/lib/libpng*
lrwxr-xr-x  1 root  admin      10 Oct 28  2019 /opt/local/lib/libpng.a -> libpng16.a
lrwxr-xr-x  1 root  admin      14 Oct 28  2019 /opt/local/lib/libpng.dylib -> libpng16.dylib
-rwxr-xr-x  1 root  admin  177352 Oct 28  2019 /opt/local/lib/libpng16.16.dylib
-rw-r--r--  1 root  admin  253120 Oct 28  2019 /opt/local/lib/libpng16.a
lrwxr-xr-x  1 root  admin      17 Oct 28  2019 /opt/local/lib/libpng16.dylib -> libpng16.16.dylib

Почему libpng жалуется на несовпадение версий? Это действительно использует неправильную версию? Если так, почему otool -L не показывает версию, с которой он работает?

1 Ответ

1 голос
/ 01 мая 2020

Ошибка связана с несоответствием между файлами заголовков и библиотекой. Версия библиотеки, указанная в командах загрузки Mach-O, не является проблемой.

Некоторые вызовы libpng требуют, чтобы вы передавали PNG_LIBPNG_VER_STRING в качестве параметра. Это эффективно запекает версию из заголовков в вызывающий код, и libpng сравнивает ее с собственной версией для проверки совместимости.

Убедитесь, что заголовки, поставляемые с библиотекой, являются (первыми) найденными компилятором .

...