“通过魔法”将不正确的依赖项添加到 CMake 目标,variable_watch 报告没有写入

问题描述 投票:0回答:1

重现:签出此存储库,分支ZP_midi,提交4c82565。

git submodule update --init
,然后
(mkdir build && cd build && cmake ..)

预期: 这会构建一个包含许多
include_subdirectory
子项目的 CMake 项目,每个子项目都会构建一个帮助程序库。
观察到: 其中两个子项目相互干扰。当我运行普通的调试工具时,它们会生成毫无意义的答案(似乎已经创建了一个库,在
add_library
时刻,已经依赖于其他项目)。

当我运行 cmake 配置时,我得到

-- Compiling with support for: 
-- Configuring done
CMake Error: install(EXPORT "RtMidiTargets" ...) includes target "rtmidi_static" which requires target "libluajit" that is not in any export set.
CMake Error in deps/rtmidi_build/CMakeLists.txt:
  export called with target "rtmidi_static" which requires target "libluajit"
  that is not in any export set.

目标 rtmidi_static 来自 CMakeLists

deps/rtmidi_build/CMakeLists.txt
。目标 libluajit 来自
deps/luajit/CMakeLists.txt
。它们完全无关;双方都不应该依赖对方。

如果我查看

build/CMakeCache.txt
,我会看到:

//Dependencies for the target
rtmidi_static_LIB_DEPENDS:STATIC=general;libluajit;general;-framework CoreServices;general;-framework CoreAudio;general;-framework CoreMIDI;general;-framework CoreFoundation;

所以,错误信息是正确的; rtmidi_static 依赖于 libluaijt。但为什么? 这就是奇怪的地方。

我将

variable_watch(rtmidi_static_LIB_DEPENDS)
添加到
CMakeLists.txt
的开头。然后我就跑
(cd build && cmake -DCMAKE_BUILD_TYPE=Debug .. --trace)
。我希望这能让我看到何时将依赖项添加到 rtmidi_static_LIB_DEPENDS。

目前在

deps/rtmidi_build/CMakeLists.txt
中创建了 rtmidi_static 目标,我得到了以下跟踪信息:

 /Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(166):  add_library(rtmidi_static STATIC ${rtmidi_SOURCES} )
CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:166 (add_library):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using UNKNOWN_READ_ACCESS
  with value "".


/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(167):  list(APPEND RTMIDI_LIB_TARGETS rtmidi_static )
/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(170):  set_target_properties(rtmidi_static PROPERTIES PUBLIC_HEADER RtMidi.h SOVERSION ${SO_VER} VERSION ${FULL_VER} )
/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(175):  target_include_directories(rtmidi_static PRIVATE $<BUILD_INTERFACE:${RTMIDI_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ${RTMIDI_INCDIRS} )
/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(181):  target_compile_definitions(rtmidi_static PRIVATE ${RTMIDI_API_DEFS} )
/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(182):  target_link_libraries(rtmidi_static ${RTMIDI_LINKLIBS} )
CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:182 (target_link_libraries):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using READ_ACCESS with
  value "general;libluajit;".


CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:182 (target_link_libraries):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using READ_ACCESS with
  value "general;libluajit;general;-framework CoreServices;".


CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:182 (target_link_libraries):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using READ_ACCESS with
  value "general;libluajit;general;-framework CoreServices;general;-framework
  CoreAudio;".


CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:182 (target_link_libraries):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using READ_ACCESS with
  value "general;libluajit;general;-framework CoreServices;general;-framework
  CoreAudio;general;-framework CoreMIDI;".

因此,不知何故,在这五行中,添加了“general;libluajit”,但以某种方式

variable_watch
看不到。

为了让事情变得更加混乱,假设我尝试使用 message() 来弄清楚何时添加这些行。我修改

deps/rtmidi_build/CMakeLists.txt
以便
add_library
行前后都有
message()
:

message("zzzz1 RTMIDI_LINKLIBS (${RTMIDI_LINKLIBS}) rtmidi_static_LIB_DEPENDS (${rtmidi_static_LIB_DEPENDS})")
  add_library(rtmidi_static STATIC ${rtmidi_SOURCES})
message("zzzz2 RTMIDI_LINKLIBS (${RTMIDI_LINKLIBS}) rtmidi_static_LIB_DEPENDS (${rtmidi_static_LIB_DEPENDS})")

此打印

/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(166):  message(zzzz1 RTMIDI_LINKLIBS (${RTMIDI_LINKLIBS}) rtmidi_static_LIB_DEPENDS (${rtmidi_static_LIB_DEPENDS}) )
CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:166 (message):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using UNKNOWN_READ_ACCESS
  with value "".


zzzz1 RTMIDI_LINKLIBS (-framework CoreServices;-framework CoreAudio;-framework CoreMIDI;-framework CoreFoundation) rtmidi_static_LIB_DEPENDS ()
/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(167):  add_library(rtmidi_static STATIC ${rtmidi_SOURCES} )
CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:167 (add_library):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using UNKNOWN_READ_ACCESS
  with value "".


/Users/mcc/work/gh/lovr/deps/rtmidi_build/CMakeLists.txt(168):  message(zzzz2 RTMIDI_LINKLIBS (${RTMIDI_LINKLIBS}) rtmidi_static_LIB_DEPENDS (${rtmidi_static_LIB_DEPENDS}) )
CMake Debug Log at deps/rtmidi_build/CMakeLists.txt:168 (message):
  Variable "rtmidi_static_LIB_DEPENDS" was accessed using READ_ACCESS with
  value "general;libluajit;".


zzzz2 RTMIDI_LINKLIBS (-framework CoreServices;-framework CoreAudio;-framework CoreMIDI;-framework CoreFoundation) rtmidi_static_LIB_DEPENDS (general;libluajit;)

注意

add_library
之前的行中
rtmidi_static_LIB_DEPENDS
为空,并且在其包含
general;libluajit;
之后的行中。

我的问题:发生了什么事?为什么?我怎样才能让它不发生?

add_library
general;libluajit;
附加到 LIB_DEPENDS 而没有触发
variable_watch
是一个错误吗?我应该归档这个吗?

编辑:我刚刚意识到我从未提到过我的 CMake 版本。我在 MacOS 10.13.6 上使用 CMake 3.20.0 运行这些测试。

我不同意我的话被用来训练 OpenAI。

cmake
1个回答
0
投票

这条评论就是问题的答案。其中一个 CMakeLists 包含

link_libraries
,它向 CMakeLists 配置步骤执行中该点之后创建的每个目标添加链接依赖项。 “通过魔法”将不正确的依赖项添加到 CMake 目标,variable_watch 报告没有写入

我不同意我的话被用来训练 OpenAI。

© www.soinside.com 2019 - 2024. All rights reserved.