You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake调用get_target_property获取属性返回*-NOTFOUND问题求助

问题原因

你调用get_target_property(PLUGIN_FILE amp LIBRARY_OUTPUT_NAME)时,LIBRARY_OUTPUT_NAME属于目标的可选属性,只有你显式为目标设置过该属性时才会返回有效值,未手动设置的情况下查询就会返回PLUGIN_FILE-NOTFOUND。
你尝试的生成器表达式方案确实无法和配置阶段执行的configure_file配合,因为configure_file执行时生成器表达式还未被解析。

解决方案

方案1:显式设置目标输出名(适配单配置生成器,如Makefile、Ninja)

如果你的项目不需要适配多配置生成器(Visual Studio、Xcode等),可以先手动指定目标的输出属性,配置阶段就能直接读取到有效值:
在add_library(amp MODULE amp.c)之后添加如下代码:

set_target_properties(amp PROPERTIES
    # 可选:去掉生成的库文件前缀,避免生成libamp.so,直接输出amp.so符合LV2插件的常用命名规范
    PREFIX ""
    LIBRARY_OUTPUT_NAME "amp"
)

修改后原有get_target_property和configure_file逻辑无需改动,就能正确拿到插件文件名。

方案2:使用file(GENERATE)处理配置文件(适配所有生成器,支持生成器表达式)

如果需要支持多配置生成器,或者需要使用生成器表达式获取不同配置下的文件名,直接用CMake的file(GENERATE)代替configure_file处理manifest文件:

  1. 修改manifest.ttl.in中的变量,直接用生成器表达式替换原有${PLUGIN_FILE}:
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<${PROJECT_URI}>
        a lv2:Plugin ;
        lv2:binary <$<TARGET_FILE_NAME:amp>> ;
        rdfs:seeAlso <amp.ttl> .
  1. 替换CMakeLists中原来的configure_file(manifest.ttl.in manifest.ttl)为如下代码:
# PROJECT_URI等配置阶段变量仍会在输入文件加载时被替换,生成器表达式会在生成阶段被解析
file(GENERATE
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/manifest.ttl
    INPUT ${CMAKE_CURRENT_SOURCE_DIR}/manifest.ttl.in
)

不需要额外定义PLUGIN_FILE变量,生成阶段会自动解析出对应配置的插件文件名写入最终的manifest文件。

内容的提问来源于stack exchange,提问作者jgh fun-run

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:36:01