VS2019编译生成动态链接库dll的两种方式

第一步:创建“动态链接库(DLL)”项目

 dll项目的默认结构如下:

 四个文件的内容因为是默认生成的,不是特别重要,接下来就是重要的修改部分:

第二步:将自己的类定义函数或者函数迁移到dll项目中

方法一:修改“pch.h”和“dllmain.cpp”文件,可以参考以下博主链接,但博主的引用部分有些繁琐,文末会介绍我的引用方法,和正常引用外部库步骤是一样的。这个方法的优点是编译简单,很顺利生成dll和lib文件。但是引用时,需要#include"pch.h",在不修改pch名称的条件下,生成多个dll后,引用时可能会有些冲突。具体的引用操作,文章最后会介绍。

(30条消息) c++生成DLL文件(visual studio 2019)面向小白萌新_西瓜6的博客-CSDN博客_c++生成dll

这里贴上我的代码,将以上博主的函数封装成类。

“pch.h”,补充了两部分,一个是预编译的标头,一个就是预编译函数的头文件。

其中关键的一点是,在类名前加上“SimpleCal_API”,这个名称可以随意修改。

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

#define SimpleCal_API ;
#ifdef SimpleCal_EXPORTS
#define SimpleCal_API __declspec(dllexport)
#else
#define SimpleCal_API __declspec(dllimport)
#endif


class SimpleCal_API Mycal {

public:
	int my_add(int a, int b);

	int my_minus(int a, int b);

	int my_multiply(int a, int b);

	double my_divide(int a, int b);
};

“dllmain.cpp”,删除了默认的内容,补充了预编译函数的源文件。

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

int Mycal::my_add(int a, int b) {
	return  a + b;
}

int Mycal::my_minus(int a, int b)
{
	return a - b;
}

int Mycal::my_multiply(int a, int b)
{
	return a * b;
}

double Mycal::my_divide(int a, int b)
{
	double m = (double)a / b;
	return m;
}

随后点击菜单栏点击“生成”->“生成解决方案”,结果如下就是生成成功了。

 方法二:不修改默认生成的四个文件,而是新建一个“smp.h”文件放置生成代码和一个"Source.def"文件。这样生成的dll文件引用时,就可以#include“smp.h”。

“smp.h”文件,对于大的项目代码,也可以拆为一个头文件和一个源文件,注意“Smpclass_API”的添加就行。

#pragma once

#define Smpclass_API ; //Don't forget to add before class if build dll
#ifdef Smpclass_EXPORTS
#define Smpclass_API __declspec(dllexport)
#else
#define Smpclass_API __declspec(dllimport)
#endif

 class Smpclass_API Mycal {

	public:
		int my_add(int a, int b) {
		return  a + b;
		}

		int my_minus(int a, int b)
		{
		return a - b;
		}

		int my_multiply(int a, int b)
		{
		return a * b;
		}

		double my_divide(int a, int b)
		{
		double m = (double)a / b;
		return m;
		}
};

"Source.def"模块定义文件,作用是如果不添加,无法生成lib文件。直接新建一个,文件内容不用任何修改。

 属性修改部分:

菜单”项目“->"属性管理器"->"C/C++"->"预处理器“->"预处理器定义"添加预编译头的#ifdef 后的”Smpclass_EXPORTS

 之后和第一种方法一样生成解决方案就行。

补充一句就是,生成的dll和平台有关,可以选择debug/release 以及X64/X86;同时可以选择不同的平台工具集。

 第三步:新建项目引用自生成的dll文件

1. 包含头文件目录

2. 包含lib文件目录

3. 链接器附加依赖项,添加lib文件

4. 将dll文件复制到所需项目的文件中

以上述第二种方法生成的dll项目,项目名”Dll3“, 举例说明如下:

头文件目录:”smp.h“所在的路径,”{你的项目路径}/Dll3“

lib文件目录:"Dll.lib"所在的路径,”{你的项目路径}\Dll3\x64\Release“

新建的引用项目文件目录:

  

引用代码如下:

#include "smp.h"
#include <iostream>


int main() {

	Mycal cal;
	int a = 1;
	int b = 2;
	int c = cal.my_add(a, b);
	std::cout << c << std::endl;
	return 0;

}

  • 3
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Matlab与Fortran的混合编程动态,是指在Matlab环境中调用Fortran代码,并将其编译动态DLL)的一种方式。通过这种混合编程的方式,可以充分发挥Matlab和Fortran各自的优势,提高代码执行效率和灵活性。 首先,在Matlab中调用Fortran代码需要通过mex函数来实现。mex函数是Matlab提供的用于编写和编译与Matlab交互的C/C++或Fortran代码的口函数。我们可以编写一个mex文件,将Fortran代码包装成一个C/C++口,然后利用mex命令编译动态着,我们需要将Fortran代码编译为静态动态。Fortran代码可以通过Fortran编译器进行编译,得到目标文件(.obj或.o文件)。然后,我们可以使用静态器或动态器将目标文件与其他必要的文件一起链生成动态文件(.dll或.so文件)。 最后,将生成动态文件与Matlab中封装Fortran代码的C/C++口一起编译成mex文件。在Matlab中执行mex命令,将动态文件与Matlab中的口函数进行链,然后就可以在Matlab中直调用Fortran代码了。通过这种方式,我们可以在Matlab中使用Fortran的高性能计算能力,并且可以灵活调用Fortran中的代码。 总之,Matlab与Fortran的混合编程动态是一种充分利用两种编程语言的优势的方式。通过将Fortran代码编译动态,并在Matlab中调用,可以实现高效的数值计算和快速原型开发。这种混合编程的方法可以提高代码的执行效率和灵活性,使得编程工作更加高效和便捷。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值