最近在搞一个程序,需要把libtorch打包成dll,让别人使用,在网上找了好久都没只有找到合适的答案,最后在一个博主大哥那里找到了,很是感激这位大哥与我们分享自己的经验,接下来我把我自己的学习过程也与大家分享一下。 一、打开vs2019,创建新项目,选择创建动态链接库。 2、配置新项目 使用Debug和x64,为什么是debug,因为我的libtorch是DeBug版本的,为什么是x64,因为x86性能支持不了。 3、不使用预编译头 4、新建头文件和cpp文件
在‘LibtorchTest.h’中编写如下代码:
#pragma once #include <iostream> extern "C" __declspec(dllexport) void MyTest();
上面代码的功能是声明一个可被调用的函数“ MyTest()”,它的返回类型是void。
现在分析一下extern "C" __declspec(dllexport) void MyTest() extern "C"的作用是告诉编译器将被它修饰的代码按C语言的方式进行编译
extern "C" __declspec(dllexport) void MyTest()
extern "C"
__declspec(dllexport),此修饰符告诉编译器和链接器被它修饰的函数或变量需要从DLL导出,以供其他应用程序使用;
__declspec(dllexport),
与其相对的还有一句代码是__declspec(dllimport)此修饰符的作用是告诉编译器和链接器被它修饰的函数或变量需要从DLL导入,
__declspec(dllimport)
最后是函数void MyTest(),它就是需要被其他程序调用的函数。 写上你的代码:
void MyTest()
#include <iostream> #include "TestDLL.h" #include <torch/torch.h> void MyTest() { torch::Tensor tensor = torch::rand({ 5,3 }); std::cout << tensor << std::endl; }
选择生成,只需要编译,不需要运行,运行会出错,本来就无法运行。 打开文件所在位置,找到编译好的dll和lib文件 **上边是生成的库文件,
下边这个是头文件** 把这三个文件拷贝到需要调用这个dll的代码的文件夹下边
修改导入的libtorchTest.h头文件里面的代码
//修改后的代码 #pragma once #pragma comment(lib,"TestDLL.lib") #include <iostream> extern "C" __declspec(dllimport) void MyTest();
添加源文件
#include "TestDLL.h" int main() { MyTest(); }
结果显示: