CMake如何使用pkg-config查找包?

时间:2013-10-11 15:25:34

标签: linux cmake cross-compiling pkg-config

我正在尝试构建一个使用CMake构建系统的程序包(即libebur128),它依赖于pkg-config来查找系统中所需的包。

在构建了所需的库之后,我发现CMake能够找到其中一个而不是其他库,尽管它们是以相同的方式构建的。

我怎么知道什么是错的?有没有办法输出它正在进行的测试或者如何使用pkg-config来定位包?因为每次查找所有必需的包时都会手动使用pkg-config

这是一个用于定位的CMake脚本,在这种情况下为libmpg123:

find_package(PkgConfig)
pkg_check_modules(PC_MPG123 QUIET libmpg123)

find_path(MPG123_INCLUDE_DIR mpg123.h
          HINTS ${PC_MPG123_INCLUDEDIR} ${PC_MPG123_INCLUDE_DIRS})
find_library(MPG123_LIBRARY NAMES mpg123 mpg123-0
          HINTS ${PC_MPG123_LIBDIR} ${PC_MPG123_LIBRARY_DIRS})

set(MPG123_LIBRARIES ${MPG123_LIBRARY})
set(MPG123_INCLUDE_DIRS ${MPG123_INCLUDE_DIR})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MPG123 DEFAULT_MSG MPG123_LIBRARY MPG123_INCLUDE_DIR)
mark_as_advanced(MPG123_INCLUDE_DIR MPG123_LIBRARY)

注意:我正在为Windows进行交叉编译,以防万一。我正在使用MinGW-w64工具链,我已经调整了pkg-config路径以查看它应该在哪里。

2 个答案:

答案 0 :(得分:4)

如果其他人像我一样偶然发现了这个:

  • 在Modules / FindPkgConfig.cmake中查看一些MESSAGE调用。特别是,在execute_process调用之前,如果要转储如何调用pkg-config。

  • 现在,和我一样,你可能会惊讶于你的MESSAGE永远不会发生!我学到的是,如果cmake在时间线中早先检查某个其他包的依赖关系时调用特定包的pkg-config,那么它在CMakeCache.txt中找到的版本是缓存,它具有会话持久性。这意味着如果你以后来更新该软件包(因为其他一些依赖项检查失败),那么CMakeCache.txt仍然保留旧值,所以尽管你把头发拉了出来,但由于版本或其他什么不对,因此会出错

  • 如果您在尝试解决cmake错误时更新任何软件包,请删除CMakeCache.txt。

答案 1 :(得分:2)

您可以使用message command显示变量的内容,并使用以下命令调用cmake:

cmake --debug-output ...

或者您可以编辑文件CMakeCache.txt

我还建议您包含以下行,以便在编译时看到正在发生的事情。

set (CMAKE_VERBOSE_MAKEFILE true)