我有一个使用 c/c++ 中的本机组件的项目,以及一些使用 .NET 的 Windows 托管项目,该项目使用 p/invoke 调用本机 DLL。所以我想要一个 cmake 生成的 .NET C# 项目,它将构建托管代码并复制它所需的本机 DLL,以便无需其他步骤即可运行它(例如直接在 Visual Studio 中构建和运行测试)。
这是通过添加自定义命令来复制 DLL 来与 .NET 4.8 一起使用,但我最近想尝试使用 SDK 风格的 vs 项目来尝试 .NET 6:
set_target_properties(${this_target} PROPERTIES
DOTNET_SDK "Microsoft.NET.Sdk"
DOTNET_TARGET_FRAMEWORK "net6.0")
Run Code Online (Sandbox Code Playgroud)
我之前复制本机 DLL 的解决方案是定义一个像这样的自定义函数,它可以复制所需的 DLL:
# in the native cmakelist for my dll with target name native_dll:
function(copy_native_dlls target output_directory)
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native1.dll ${output_directory}
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native1.pdb ${output_directory}
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${build_binaries_path}/$<CONFIG>/native_dll/native2.dll ${output_directory}
DEPENDS native_dll
COMMENT "copying native DLLs"
)
endfunction()
Run Code Online (Sandbox Code Playgroud)
在每个托管项目中,我会在需要时添加以下内容:
copy_native_dlls(${this_target} $<TARGET_FILE_DIR:${this_target}>)
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试使用 SDK 风格的项目迁移到 .NET 6 时,我无法再使用add_custom_command:DOTNET_SDK 文档
注意 此版本的 CMake 中的 Visual Studio 生成器尚未学会支持 .NET SDK 样式项目中的 add_custom_command()。目前,将自定义命令附加到设置了 DOTNET_SDK 属性的目标是错误的。
是否有其他方法可以将我的项目中构建的 .DLL 添加到另一个项目,以便在构建它时将其复制到输出目录?我希望有某种方法可以在 cmake 中指向这些 dll 并正确设置依赖项
小智 0
我知道这听起来不对,但我能让它发挥作用的唯一方法就是这个
add_custom_target(${this_target}
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:${TARGETFILE}>"
"$<TARGET_FILE_DIR:${TARGETDIR}>"
)
set_target_properties(${this_target} PROPERTIES VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.7.1"
VS_GLOBAL_ResolveNuGetPackages "false")
add_dependencies(${TARGETDIR} ${this_target})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |