rclone编译及c++调用,挂载MinIO

rclone编译及c++调用,挂载MinIO

  问题的起因:要做一个资源上传下载的功能,第三方工具rclone挺好,只是大多数人使用cmd命令行的方式进行使用。在某些情况下,自己的程序调用其它exe工具,会被电脑的安全程序进行拦截和警告,所以想在c++程序里面调用API,不使用命令行。本教程在Windows下进行

1. 参考文档

- rclone源码包里面的MANUAL.txt
- rclone-master\librclone\ctest\ctest.c

2. 注意事项

  rclone的源码地址:rclone地址

  rclone的源码为golang语言,我们需要把它编译成动态库dll,供c++调用,编译的目标为源码文件夹下的rclone-master\librclone\librclone.go。go语言编译动态库dll的方法比较简单,在安装MinGW的install版本,安装完毕后,系统变量就会有相关配置,重启电脑即可生效。

2.1编译go文件为dll和.h

进入到rclone-master\librclone\librclone.go的同级目录,打开cnd,执行

go build -buildmode=c-shared -o librclone.dll librclone.go

即可在同级目录下得到dll和.h

操作步骤1

2.2 c++程序调用

这里属实有些坑啊
官方给的建议
rclone官方建议

  • 构建“librclone”作为共享库,并使用运行时动态链接不要尝试用’ FreeLibrary '卸载库
  • 使用API函数’ RcloneFreeString '释放返回的字符串
  • 定义struct ’ RcloneRPCResult ‘,而不是包含’ librclone.h ’
  • 使用UTF-8编码的字符串
    -正确转义JSON字符串,注意本机路径分隔符

我第一次没整明白,为什么不用包含头文件,只需定义一个结构体RcloneRPCResult,不会是因为我菜吧!!!

重点来了:动态调用librclone.dll,下面为main.cpp代码

#include <Windows.h>

struct RcloneRPCResult {
	char* Output;
	int	Status;
}; //这个是从.h里面粘出来了的,官方文档建议只定义一个结构体来接收函数的返回值

int main()
{
	HINSTANCE module = LoadLibrary(L"librclone.dll");
	if (module == NULL)
	{
		cout << "加载DemoDLL.dll动态库失败" << endl;
		return -1;
	}


	typedef RcloneRPCResult(*PLUSFUNC)(char* a, char* b); //后边为参数,前面为返回值

	PLUSFUNC RcloneRPC = (PLUSFUNC)GetProcAddress(module, "RcloneRPC");

	const char* configCreate = "config/create";
	const char* configParam = "{"
		"\"name\": \"LinkMinIO\","
		"\"type\": \"s3\","
		"\"parameters\": {"
		"\"provider\": \"Minio\","
		"\"access_key_id\": \"Minio的账号\","
		"\"secret_access_key\": \"Minio的密码\","
		"\"endpoint\": \"http://192.168.30.127:6000\""
		"}"
	"}";

	RcloneRPCResult res1 = RcloneRPC(const_cast<char*>(configCreate), const_cast<char*>(configParam));
	
	const char* cpc = "{"
		"\"srcFs\": \"E:/test/Project4/Project4\","
		"\"srcRemote\": \"Debug/rclone.conf\","
		"\"dstFs\": \"LinkMinIO:xpf-resources3/asserts\","  //LinkMinIO:xpf-resources
		"\"dstRemote\": \"tmp/rclone.conf\""
		"}";
	const char* cpc1 = "operations/copyfile";
	RcloneRPCResult res2 = RcloneRPC(const_cast<char*>(cpc1), const_cast<char*>(cpc));
}

这个时候你去看MinIO查看,就会发现rclone.config传到服务器了。例子只是配置和拷贝的接口调用,其它功能请参考官方文档MANUAL.txt,它在源码的根目录下。
上传成功

创作不易,希望能帮助到大家,转载请注明出处。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值