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
相关产品推荐
相关产品推荐

