PkgConfig 模块:INCLUDE_DIRS 未列出所有目录
PkgConfig module: INCLUDE_DIRS not listing all directories
简短版本(长话短说;DR)
使用带有 PkgConfig 模块的 CMake 我尝试打印我的项目所需的库的所有包含目录,我们称之为 thelibrary
。我通过打印 THELIBRARY_INCLUDE_DIRS
变量的值来做到这一点。打印出include目录列表,但是少了一个目录
这真的让它很惊讶,好像我在终端上输入了以下内容:
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 ...
其中auxlib1
、auxlib2
等是我需要编译的辅助包含目录。
但我也期望输出中的 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
.
简短版本(长话短说;DR)
使用带有 PkgConfig 模块的 CMake 我尝试打印我的项目所需的库的所有包含目录,我们称之为 thelibrary
。我通过打印 THELIBRARY_INCLUDE_DIRS
变量的值来做到这一点。打印出include目录列表,但是少了一个目录
这真的让它很惊讶,好像我在终端上输入了以下内容:
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 ...
其中auxlib1
、auxlib2
等是我需要编译的辅助包含目录。
但我也期望输出中的 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
.