pkg-config сообщает о путях, отличных от тех, что указаны в файле pc

Я собрал libpng с помощью CMake и добавил сгенерированный файл .pc в каталог pck-config.

Проекты, для которых требуется libpng, не собираются, потому что pkg-config предоставляет неправильные пути при вызове, например pkg-config --cflags libpng

Отладочный вывод:

$ pkg-config.exe --debug libpng
no output option set, defaulting to --exists
Error printing disabled by default due to use of output options --exists, --atleast/exact/max-version, --list-all or no output option at all. Value of --print-errors: 0
Error printing disabled
Adding virtual 'pkg-config' package to list of known packages
Looking for package 'libpng'
Looking for package 'libpng-uninstalled'
Reading 'libpng' from file 'C:\mingw64\mingw64\lib\pkgconfig\libpng.pc'
Parsing package file 'C:\mingw64\mingw64\lib\pkgconfig\libpng.pc'
  line>prefix=C:/Program Files (x86)/libpng
 Variable declaration, 'prefix' overridden with 'C:/mingw64/mingw64'
  line>exec_prefix=C:/Program Files (x86)/libpng
 Variable declaration, 'exec_prefix' has value 'C:/Program Files (x86)/libpng'
  line>libdir=C:/Program Files (x86)/libpng/lib
 Variable declaration, 'libdir' has value 'C:/mingw64/mingw64/lib'
  line>includedir=C:/Program Files (x86)/libpng/include/libpng16
 Variable declaration, 'includedir' has value 'C:/mingw64/mingw64/include/libpng16'
  line>
  line>Name: libpng
  line>Description: Loads and saves PNG files
  line>Version: 1.6.37
  line>Requires: zlib
  line>Libs: -L${libdir} -lpng16
  line>Libs.private: -lz -lm
Unknown keyword 'Libs.private' in 'C:\mingw64\mingw64\lib\pkgconfig\libpng.pc'
  line>Cflags: -I${includedir}
Path position of 'libpng' is 3
Adding 'libpng' to list of known packages

В руководстве указано:

Особенности Windows

Если файл .pc найден в каталоге, который соответствует обычным соглашениям (т. е. заканчивается на \lib\pkgconfig), предполагается, что префикс для этого пакета является прародителем каталога, в котором был найден файл, а переменная префикса соответственно переопределяется для этого файла.

Однако у меня нет ${prefix} в файле .pc. Я понятия не имею, откуда берутся замены и как их исправить. Сообщается, что переопределено только prefix, остальное сообщается как «имеющее значение», но напечатанные пути не являются теми, что объявлены в файле, они даже не существуют.


person Xeverous    schedule 24.11.2019    source источник


Ответы (1)


Решение этой проблемы на самом деле является дубликатом Почему pkg-config переопределяет "префикс" другим по умолчанию?

      When this feature is enabled and a .pc file is found in a direc-
      tory named pkgconfig, the prefix for that package is assumed  to
      be  the  grandparent  of the directory where the file was found,
      and the prefix variable is overridden for that file accordingly.

      If  the value of a variable in a .pc file begins with the origi-
      nal, non-overridden, value of  the  prefix  variable,  then  the
      overridden value of prefix is used instead. This allows the fea-
      ture to work even when the variables have been expanded  in  the
      .pc file.

Эту функцию можно отключить с помощью --dont-define-prefix, но она включена по умолчанию в Windows, и программы, запрашивающие pkg-config, не добавляют этот флаг. Я понятия не имею, в чем смысл этой функции, но решение довольно простое:

  • переместить .pc файлов в каталог без имени pkgconfig
  • добавить этот каталог в переменную окружения PKG_CONFIG_PATH
person Xeverous    schedule 24.11.2019