如何链接.lib文件至python环境中使用
导师项目中需要用到C++/python的混合编程,我最近苦恼于.lib文件与.dll文件至python环境中的调用,在网上搜索也没有直接有效的解决方法;
解决思路:在.dll文件能被python调用的基础上,链接.lib(静态链接库)文件到.dll(动态链接库)中,再经过ctypes调用.dll文件,这样就可以实现预期结果
实验环境:(windows64位+VS2017+python3.6.8+pycharm)
1 实现.lib文件到.dll文件的调用(类似于C++控制台程序调用.lib文件)
参考网友的博客C++控制台程序调用.lib文件,调用.lib文件.
//testLib.cpp文件
#include"testLib.h"
double calcdang::plusdang(double a, double b) { return a + b; }
double calcdang::multdang(double a, double b) { return a * b; }
double calcdang::subdang(double a, double b) { return a - b; }
//testLib.h文件
#pragma once
class calcdang {
public:
double plusdang(double a, double b);
double multdang(double a, double b);
double subdang(double a, double b);
};
生成test_libForCPP.lib文件,注意程序的调试环境(X86? X64?),这个很重要奥...
现在就来生成.dll文件:
//.ctypesdll.cpp文件
//extern "C" C++中编译c格式的函数,如果利用c语言编译不需要
//__declspec(dllexport) 导出到库中(win系统环境下.dll文件链接宏)
#include <stdio.h>
#include "testLib.h" //.lib文件的头文件
#include <iostream>
using namespace std;
extern "C" __declspec(dllexport) void TestCtypes()
{
printf("In C testCtypes\n");
//调用.lib文件中的函数
calcdang datatest1;
cout.flags(ios::fixed);
cout.precision(2);//设置输出精度
cout << "2.11*6.22 = " << datatest1.multdang(2.11, 6.22) << endl;
cout << "2.11-6.22 = " << datatest1.subdang(2.11, 6.22) << endl;
cout << "2.11+6.22 = " << datatest1.plusdang(2.11, 6.22) << endl;
system("pause");
}
在项目的属性->VC++目录-->包含目录中添加testLib.h文件目录
在项目的属性->VC++目录-->包含目录中添加test_libForCPP.lib文件目录
在附加依赖库中添加.lib文件的全称,注意文件名称的准确性!
至此,可生成CtypesTest.dll动态链接库文件
2 在python环境下调用CtypesTest.dll文件
希望帮到更多朋友,本人菜鸟一只.