当前位置: 首页 > article >正文

CMake构建C#工程(protobuf)

工程目录结构

第一级CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
# 指定为csharp工程
project(CSharpDemo CSharp)
# 添加二级目录
add_subdirectory(src)

第二级CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(CSharpDemo CSharp)

# 指定protoc程序目录,用于执行输出cs文件
set(PROTOC_PATH ${CMAKE_SOURCE_DIR}/src/protoc)

add_subdirectory(BaseModel)

第三级CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(CSharpDemo CSharp)

# 指定编译器
set(CMAKE_CSharp_COMPILER "csc")
# 指定输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/output/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/output/Release)

set(cur_path ${CMAKE_CURRENT_SOURCE_DIR})
set(out_path ${CMAKE_CURRENT_BINARY_DIR})
message("*** ${PROTOC_PATH} ${cur_path} ${out_path}")

# 获取proto文件,proto文件首字母大写
file(GLOB proto_files *.proto)

# 遍历输出对应的cs文件
foreach(proto_file ${proto_files})
	get_filename_component(proto_name ${proto_file} NAME_WE)
	message("*** ${proto_file} ${proto_name}")
	set(csharp_file "${proto_name}.cs")
	add_custom_command(
		OUTPUT ${csharp_file}
		COMMAND protoc --csharp_out=${out_path} --proto_path=${cur_path} ${proto_name}.proto
		WORKING_DIRECTORY ${PROTOC_PATH}
		VERBATIM
	)
	list(APPEND csharp_files ${csharp_file})
endforeach()

add_executable(${PROJECT_NAME}
	app.config
	Program.cs TSimObject.cs
	${csharp_files}
)

# 设置目标框架,与app.config中对应
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5")

# 设置引用第三方动态库
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCE_MyThirdPartyLib
	../packages/Google.Protobuf.3.5.1/lib/net45/Google.Protobuf.dll
)

# 设置引用
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCES
	"Google.Protobuf"
	"Microsoft.CSharp"
	"System"
	"System.Core"
	"System.Data"
	"System.Data.DataSetExtensions"
)

通过build.bat执行编译

@echo off

cd /d %~dp0
mkdir build
cd build
cmake .. -G "Visual Studio 12 2013"
rem cmake --build . --config Debug
if "%1"=="" (cmake --build . --config Release) else (cmake --build . --config %1)
cd ..
pause

执行后的输出如下:


http://www.kler.cn/a/507212.html

相关文章:

  • 软件设计大致步骤
  • YOLOv10-1.1部分代码阅读笔记-build.py
  • [Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明
  • 基于YOLOv8与CGNet的鸟类智能识别系统 深度学习图像分类 鸟类目标检测与分类 图像特征提取 模型优化与应用 数据可视化(源码+指导+定制)
  • 【混合开发】CefSharp+Vue 解决Cookie问题
  • 【Linux】11.Linux基础开发工具使用(4)
  • Web 实时消息推送的七种实现方案
  • SpringBoot链接Kafka
  • 在 .NET 9 中使用 Scalar 替代 Swagger
  • 基于 Python 的财经数据接口库:AKShare
  • NFTScan | 01.06~01.12 NFT 市场热点汇总
  • 图论基础,如何快速上手图论?
  • Redis哨兵模式搭建示例(配置开机自启)
  • 代码随想录25 回溯算法
  • 78_Redis网络模型
  • K8S--边车容器
  • 如何Python机器学习、深度学习技术提升气象、海洋、水文?
  • 2025第3周 | json-server的基本使用
  • Linux下使用MySql数据库
  • 采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)
  • 浏览器中的Markdown编辑器
  • 【2024年华为OD机试】(B卷,100分)- 相对开音节 (Java JS PythonC/C++)
  • java常用开发工具类
  • uniapp 自定义日历组件 源码
  • Spring Boot中的自动配置原理是什么
  • 2025智能网联汽车数据分类分级白皮书