2

我正在尝试构建一个使用 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了路径以查看它应该在哪里。

4

2 回答 2

4

以防其他人像我一样偶然发现:

  • 在 Modules/FindPkgConfig.cmake 中进行一些 MESSAGE 调用。特别是,在 execute_process 调用之前,如果您想转储 pkg-config 是如何被调用的。

  • 现在,像我一样,您可能会惊讶于您的 MESSAGE 从未发生过!我学到的是,如果 cmake 为特定包调用 pkg-config,同时在时间轴的早期检查其他包的依赖关系,那么它找到的版本将缓存在具有会话持久性的 CMakeCache.txt 中。这意味着如果您稍后来更新该软件包(因为其他一些依赖项检查失败),那么 CMakeCache.txt 仍然保留旧值,因此尽管您拔掉头发,但由于版本或其他任何内容不正确,cmake 会出错.

  • 简而言之,如果您在尝试通过 cmake 错误时更新任何软件包,请删除 CMakeCache.txt。

于 2015-02-25T17:43:30.483 回答
2

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

cmake --debug-output ...

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

我还建议您包含以下行,以便您在编译时了解发生了什么。

set (CMAKE_VERBOSE_MAKEFILE true)
于 2014-02-01T11:43:01.257 回答