目录

如何链接.lib静态链接库文件至python环境中使用借助.dll和ctypes库文件

如何链接.lib(静态链接库)文件至python环境中使用(借助.dll和ctypes库文件)

如何链接.lib文件至python环境中使用

导师项目中需要用到C++/python的混合编程,我最近苦恼于.lib文件与.dll文件至python环境中的调用,在网上搜索也没有直接有效的解决方法;

解决思路 :在.dll文件能被python调用的基础上,链接.lib(静态链接库)文件到.dll(动态链接库)中,再经过ctypes调用.dll文件,这样就可以实现预期结果

实验环境: (windows64位+VS2017+python3.6.8+pycharm)

1 实现.lib文件到.dll文件的调用(类似于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");
}

https://i-blog.csdnimg.cn/blog_migrate/a4b7c6c92d4c7622b48d1f2c7459554b.png

在项目的属性->VC++目录–>包含目录中添加testLib.h文件目录

在项目的属性->VC++目录–>包含目录中添加test_libForCPP.lib文件目录

https://i-blog.csdnimg.cn/blog_migrate/f40ae97ed8e18b967ba8292c402fecae.png

在附加依赖库中添加.lib文件的全称,注意文件名称的准确性!

至此,可生成CtypesTest.dll动态链接库文件

https://i-blog.csdnimg.cn/blog_migrate/f47a5dba151cf2805fcd0eed37632ed6.png

2 在python环境下调用CtypesTest.dll文件

https://i-blog.csdnimg.cn/blog_migrate/234c72a3046a3c9add6d8cb61c143b5f.png

希望帮到更多朋友,本人菜鸟一只.