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文件:
- 修改
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> .
- 替换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
相关产品推荐
相关产品推荐

