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

CMake如何在生成器表达式中判断目标是否为SHARED共享库

实现方案

前置说明

原示例中通过读取BUILD_SHARED_LIBS属性判断库类型的方式兼容性有限,更推荐使用CMake内置的目标类型判断生成器表达式,可适配目标显式指定STATIC/SHARED类型的场景。


步骤1:配置CMakeLists.txt

首先确保Foo、Bar目标定义完成后再调用file(GENERATE),可提前配置.NET运行时标识符:

# 可根据目标平台修改,也可通过编译参数-DRUNTIME_IDENTIFIER=xxx传入
set(RUNTIME_IDENTIFIER "linux-x64" CACHE STRING ".NET 目标运行时标识符")

# 省略Foo、Bar目标的定义逻辑

file(GENERATE
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/foo.csproj
  INPUT ${CMAKE_CURRENT_SOURCE_DIR}/foo.csproj.in
)

步骤2:编写foo.csproj.in模板

使用$<SHARED_LIBRARY:Foo>生成器表达式判断目标类型,按需拼接Foo的库路径:

...
<Content Include="$<TARGET_FILE:Bar>$<$<SHARED_LIBRARY:Foo>:;$<TARGET_FILE:Foo>>">
      <PackagePath>runtimes/@RUNTIME_IDENTIFIER@/native/%(Filename)%(Extension)</PackagePath>
      <Pack>true</Pack>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...

效果验证

  • 若Foo为共享库:生成的csproj中Include属性会自动拼接两个库的路径,例如<Content Include="build/lib/Bar.so;build/lib/Foo.so">
  • 若Foo为静态库:生成的csproj中Include属性仅包含Bar的路径,无多余分号,例如<Content Include="build/lib/Bar.dll">

内容的提问来源于stack exchange,提问作者Mizux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:45:03