c++ - PkgConfig 模块 : INCLUDE_DIRS not listing all directories

标签 c++ cmake pkg-config

简短版(长话短说)

使用带有 PkgConfig 模块的 CMake 我尝试打印我的项目所需的库的所有包含目录,我们称它为 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等是我需要编译的辅助include目录。

但我还期望输出中有 dir /opt/thelibrary/include,如果我在终端上使用 pkg-config 命令,就会打印出来,如开始。怎么可能只有那个目录不打印呢?

最佳答案

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

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

既然那个目录不存在了,那么它就不会出现在THELIBRARY_INCLUDE_DIRS中,新的目录也不会出现只是因为文件CmakeCache.txt还在指向以前的版本。

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

关于c++ - PkgConfig 模块 : INCLUDE_DIRS not listing all directories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490099/

相关文章:

windows - 如何在 Windows 上为 pkg-config 编写 *.pc 文件?

c++ - 为什么我下面的第二个片段显示未定义的行为?

c++ - CMakeList : Dependencies for static libraries

python - cmake 发现错误的 python 库

带有 CMake 错误 : manifest 'build.ninja' still dirty after 100 tries 的 Visual Studio 上的 C++

android - pkg-config 无法在 ffmpeg build (linux) 上找到库

cross-compiling - pkg-config 无法在 sysroot 目录下找到包

c++ - 具有直接 QueryPerformanceCounter 值的时钟是否符合 C++ 标准?

c++ - 如何确定使用哪个类特化?

c++ while(cin>>s) 什么时候停止