【问题标题】:PkgConfig module: INCLUDE_DIRS not listing all directoriesPkgConfig 模块:INCLUDE_DIRS 未列出所有目录
【发布时间】:2018-05-23 13:47:31
【问题描述】:

短版 (TL;DR)

将 CMake 与 PkgConfig 模块结合使用,我尝试打印项目所需的库的所有包含目录,我们称之为 thelibrary。我通过打印THELIBRARY_INCLUDE_DIRS 变量的值来做到这一点。打印了包含目录的列表,但缺少一个目录。

这真的让我很惊讶,好像我在终端上输入了以下内容:

pkg-config thelibrary --cflags

然后所有打印包含目录,包括THELIBRARY_INCLUDE_DIRS中缺少的目录。

如果我尝试打印 THELIBRARY_CFLAGS 的值,也会发生同样的情况。

这怎么可能?错误在哪里? (希望是我的失误)

详情

上下文

我正在开发一个 C++ Cmake 项目,该项目在 Mac OS 下正确编译,但在 Linux (Ubuntu) 下编译不正确,在调查可能的原因时,我发现了以下问题。

问题

我将PkgConfig 模块包含在文件CMakeLists.txt 中:

find_package(PkgConfig REQUIRED)    

之后,为了使用这个库,我设置了PKG_CONFIG_PATH环境变量:

set(ENV{PKG_CONFIG_PATH} "/usr/local/opt/thelibrary/pkgconfig:$ENV{PKG_CONFIG_PATH}")

最后,我把这条指令放到了图书馆里。

pkg_check_modules(THELIBRARY thelibrary)

最后,为了调试,我尝试通过写来打印包含目录的列表:

MESSAGE( STATUS "THELIBRARY DIRS: " ${THELIBRARY_INCLUDE_DIRS} )

问题是,它起作用了,实际上它打印了一个包含目录的列表,但问题是最重要的一个丢失了。事实上,输出是这样的:

/opt/auxlib1/include/opt/auxlib2/include ...

其中auxlib1auxlib2 等是我需要编译的辅助包含目录。

但我也期望输出中的目录/opt/thelibrary/include,如果我在终端上使用pkg-config 命令,如开头所述,将打印该目录。怎么可能只打印那个目录?

【问题讨论】:

  • 不如试试下面的MESSAGE("INCLUDE_DIRECTORIES: ${INCLUDE_DIRECTORIES}")
  • 谢谢@VictorGubin,不幸的是INCLUDE_DIRECTORIES 似乎是空的。
  • 然后打印所有编译器标志,即CMAKE_C_FLAGSCMAKE_CXX_FLAGS
  • 第一个为空,第二个包含-std=c++11 -Wall
  • 尝试删除缓存(构建目录中的CMakeCache.txt)并重新运行cmake。如果这没有帮助,那么 CMake 似乎错误地处理了第一个包含目录。如果您希望我们帮助调试,我们需要查看pkg-config确切输出

标签: c++ cmake pkg-config


【解决方案1】:

感谢 Tsyvarev 的建议(删除CMakeCache.txt),我明白了原因,而且由于其他人可能会发生这种情况,我希望这个解释有所帮助。

/opt/thelibrary/include 目录没有出现在 THELIBRARY_INCLUDE_DIRS 中的原因是文件 CMakeCache.txt 包含有关该库的以前版本的信息,其头文件安装在一个名称稍有不同的目录中,当之前的版本卸载时,该目录被删除

既然那个目录已经不存在了,那么它就不会出现在THELIBRARY_INCLUDE_DIRS中,而且新目录也不会出现仅仅因为文件CmakeCache.txt仍然指向之前的版本。

解决方法:删除CmakeCache.txt,重新运行cmake

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2011-11-09
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2012-04-22
    相关资源
    最近更新 更多