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
2.2 c++程序调用
这里属实有些坑啊
官方给的建议
- 构建“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,它在源码的根目录下。
创作不易,希望能帮助到大家,转载请注明出处。