Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake variable#u watch不';t显示对变量PKG_CONFIG_可执行文件的修改_C++_Cmake - Fatal编程技术网

C++ CMake variable#u watch不';t显示对变量PKG_CONFIG_可执行文件的修改

C++ CMake variable#u watch不';t显示对变量PKG_CONFIG_可执行文件的修改,c++,cmake,C++,Cmake,我有由FindPkgConfig.cmake设置的PKG\u CONFIG\u EXECUTABLE变量的无效值,因此我想检查原因。为此,我添加了variable\u watch(PKG\u CONFIG\u可执行文件)。结果如下: (...) CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:27 (if): Variable "PKG_CONFIG_EXECUTABLE&

我有由
FindPkgConfig.cmake
设置的
PKG\u CONFIG\u EXECUTABLE
变量的无效值,因此我想检查原因。为此,我添加了
variable\u watch(PKG\u CONFIG\u可执行文件)
。结果如下:

(...)
CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:27 (if):
  Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
  "aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
  build/_deps/domedependency/CMakeLists.txt:11 (include)


CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:30 (find_program):
  Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
  "aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
  build/_deps/domedependency/CMakeLists.txt:11 (include)


CMake Debug Log at /home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:33 (if):
  Variable "PKG_CONFIG_EXECUTABLE" was accessed using READ_ACCESS with value
  "/home/my/Projects/zzz/aarch64-linux-gnu-pkg-config".
Call Stack (most recent call first):
  build/_deps/domedependency/CMakeLists.txt:11 (include)

(...)
因此,变量在没有任何写访问权限的情况下发生了更改。怎么可能呢


更重要的是,新的变量值是错误的——CMake通过将正确的可执行文件名与项目的根目录连接在一起,以某种方式生成了错误的路径。我认为这可能是
FindPkgConfig.cmake

中的一个错误,根据文档,它不跟踪对缓存变量的访问。变量
PKG\u CONFIG\u EXECUTABLE
实际上是一个缓存变量

但是,在CMake中读取变量始终使用变量的非缓存版本:非缓存版本在第一个变量取消引用时创建,并设置为与缓存版本相等。有关详细信息,请参阅文档:

也就是说,
variable\u watch
对于观察缓存变量仍然有用:可以假设变量是在包含不同值的两次读取之间写入的。在您的情况下,变量写在两行之间

/home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:30
/home/my/CMake/share/cmake-3.16/Modules/FindPkgConfig.cmake:33
当(非缓存)变量将值从
aarch64 linux-gnu-pkg-config
更改为
/home/my/Projects/zzz/aarch64 linux-gnu-pkg-config


使用给定的脚本,您可以猜测变量的设置位置

find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable")
此命令用于搜索名为
pkg config
的可执行文件,因此它无法找到
/home/my/Projects/zzz/aarch64 linux gnu pkg config
,该文件具有可执行文件的其他基本名称。产生该值的唯一原因是:变量在命令行中设置


似乎您将参数
-DPKG\u CONFIG\u EXECUTABLE=aarch64 linux gnu pkg CONFIG
传递给
cmake
调用。这可以解释为什么在
find\u program
之前,
PKG\u CONFIG\u EXECUTABLE
已被评估为该值


这也可以解释新的值:
PKG\u CONFIG\u EXECUTABLE
应该是对应可执行文件的绝对路径。因此,CMake将您的输入--
aarch64 linux gnu pkg配置
-解释为相对路径,并将其转换为绝对路径一-
/home/my/Projects/zzz/aarch64 linux gnu pkg配置
。这是有文档记录的转换:请参阅中
-D
选项的说明。但是这种转换只允许
PATH
FILEPATH
类型的缓存变量,这就是为什么转换被延迟到定义变量类型的
find\u program
调用


因此,如果要将值设置为变量
PKG\u CONFIG\u EXECUTABLE
,则需要设置绝对路径,而不仅仅是可执行文件的名称。

PKG\u CONFIG\u EXECUTABLE
是一个缓存变量。因此,它存储在CMake调用之间。您需要清除CMake缓存(删除生成目录或仅删除其中的
CMakeCachek.txt
文件),以观察变量的赋值。@Tsyvarev输出来自第一次CMake调用,
CMakeCache.txt
不存在。但我认为这并不重要——看看第二和第三输出日志部分之间的区别。在脚本执行期间,变量会在其间更改其值。没错,变量是在命令行中设置的。我还尝试在我的工具链文件中设置它,并通过
CMAKE\u工具链文件
传递,但它不起作用。也就是说,它只是简单的
set(PKG\u CONFIG\u可执行文件aarch64 linux gnu PKG CONFIG)
。你能猜出它为什么不起作用吗?无论如何,感谢您的澄清。再一次,可执行文件
PKG\u CONFIG\u
应该包含绝对路径,因此value
aarch64 linux gnu PKG CONFIG
对于它来说完全无效。如果要让CMake查找可执行文件,请使用
find\u program
命令。(这种方式仅适用于工具链,使用
-D
选项,您不能要求CMake搜索任何内容)。@好的,CMake工具链文件中的两行解决了我的问题:
set(PKG\u CONFIG\u EXECUTABLE\u NAME aarch64 linux gnu PKG CONFIG)
查找程序(PKG\u CONFIG\u EXECUTABLE${PKG\u CONFIG\u EXECUTABLE\u NAME})谢谢您的帮助