重现:签出此存储库,分支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。
这条评论就是问题的答案。其中一个 CMakeLists 包含
link_libraries
,它向 CMakeLists 配置步骤执行中该点之后创建的每个目标添加链接依赖项。 “通过魔法”将不正确的依赖项添加到 CMake 目标,variable_watch 报告没有写入
我不同意我的话被用来训练 OpenAI。