C++动态链接库(DLL)的创建及调用

C++动态链接库(DLL)的创建及调用

1. 动态链接库生成

  1. 在新建项目中选择Visual C++,并且选择Win32控制台应用程序,填写项目名称,这里我把这个工程的名称名命为“dllExample.cpp”。点击确定
    创建文件1
    进入下一个页面,点击下一步

创建文件2
在应用程序设置窗口中,选择DLL以及预编译头,点击完成
创建文件3
新建一个header文件,这里我取名为dllExample.h。输入以下内容。

// dllExample.h
#pragma once

#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)

extern "C" DLLEXAMPLE_EXPORT_API int add(int a, int b);

#pragma once代表该文件只编译依次,不进行重复编译。
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)定义了一个名为DLLEXAMPLE_EXPORT_API的宏,这个宏代表__declspec(dllexport)。__declspec(dllexport)的作用是告诉编译器哪个函数是可以被外部访问的。
下一行代码中的 extern “C” 代表该接口可以被c++以外的语言待用使用。
下面新建一个dllExample.cpp的文件,用来实现add函数。

// dllExample.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"

#include "dllExample.h"

int add(int a, int b) {
	return a + b;
}

右击工程,点击生成
build
如果生成成功可以看到下面的结果。
build2
在上述的debug或者release目录下可以看到生成的文件,下面我们主要会使用dllExample.dll和dllExample.lib这两个文件。
build3
这里会有几个坑,和大家分享一下:

  1. 生成dll文件时,不要点击运行,会跳出如下窗口报错。
    dll_bug1
  2. 注意你要生成的dll文件是debug还是release,是x86还是x64,在app调用时需要匹配一致。如果需要修改,可以在下面的选框里修改。
    dll_bug2
  3. 生成的.dll文件在工程目录下的目录下的debug或者release目录下(工程下面有两个debug/release目录,不要搞错了)。如果是x64在工程目录下会有一个x64的目录下面,x64目录会有debug或者release的目录。
  4. #include "stdafx.h"主要用于预编译[1],必须放在最前面。
  5. 如果在编译中出现了strcpy,fopen等函数,可能会导致栈溢出,因此会报错。

error C4996: ‘strcpy’: This function or variable may be unsafe.error

此时可以将strcpy,fopen改成strcpy_s和fopen_s。或者在项目属性中的C/C++预处理器中的预处理器定义里添加_CRT_SECURE_NO_WARNINGS。[2]
dll_debug3

2. 动态链接库的调用

调用dll库需要新建一个新的工程,点击Visual C++中的Win32控制台应用程序,并且将其名命为dllClient。
app1
在应用程序类型中选择控制台应用程序,附加选项中选择预编译头完全开发生命周期(SDL)检查( C )。点击完成
app2
在项目中的源文件中,新建一个dllclient.cpp的文件。

// dllClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "dllExample.h"
#include <iostream>

using namespace std;


int main()
{
	int a = 1;
	int b = 2;
	int c = add(a, b);
	cout << "1 + 2 = " << c << endl;
    return 0;
}

现在在#include"dllExample.h"的#include下会有一个红色下划线,如下图所示。这是因为include默认的目录下无法找到dllExample.h及其关联文件。
在这里插入图片描述
一般有以下三种方法:
方法1 --直接将文件拷贝到目录下
这里读者可以直接把dllExample.h,dllExample.lib和dllExample.dll文件,复制到dllclient的工程目录下面,在上述代码的using namespace std;下面添加一句

#pragma comment(lib, “dllExample.lib”)

点击运行可以得到如下结果。
在这里插入图片描述
方法2 --设置C/C++的附加库目录
如果文件依赖较多,不方便直接拷贝到工程目录下,可以在工程目录下进行如下操作:
首先在工程属性中的C/C++常规附加包含目录,中将dllExample.h文件的所在路径添加进去。这里需要注意的是配置选项中的debug/release以及平台x64或者x86需要与编译时的选项一致。
在这里插入图片描述
链接器常规里的附加库目录里添加dllExample.lib的所在路径。
在这里插入图片描述
链接器输入里的附加依赖项里添加dllExample.lib。
在这里插入图片描述
生成事件后期生成事件里的命令行里添加以下命令。

xcopy /y /d “/dir/dllExample.dll”

/dir为实际的dll文件所在的路径。
在这里插入图片描述
方法3 --在VC目录中设置
如果整个工程只有C++文件。可以直接在VC目录里设置。
VC++目录下的包含目录里添加dllExample.h所在的路径,在库目录里添加dllExmaple.lib所在的路径。
在这里插入图片描述
链接器输入里的附加依赖项里添加dllExample.lib。
在这里插入图片描述
生成事件后期生成事件里的命令行里添加以下命令。

xcopy /y /d “/dir/dllExample.dll”

/dir为实际的dll文件所在的路径。

[1] https://blog.csdn.net/sinat_36053757/article/details/71265257
[2] https://blog.csdn.net/u010182186/article/details/74936224

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: C语言中创建动态链接库供C程序使用的步骤如下: 1. 写好要封装的C语言函数或者模块的代码,并将其保存为一个或多个C文件。 2. 编写一个头文件,将要使用的函数或者模块的声明放在该头文件中。 3. 打开终端或者命令提示符,使用GCC编译器将C文件编译为目标文件。命令如下: `gcc -c 文件名.c -o 输出的目标文件名.o` 这样会将C文件编译为目标文件,目标文件是二进制文件,用来存储编译后的机器码。 4. 将编译好的目标文件打包成动态链接库动态链接库的命名规则为"libxxx.so",其中xxx为动态链接库的名字。命令如下: `gcc -shared 目标文件1.o 目标文件2.o -o libxxx.so` 这样会将目标文件打包成动态链接库动态链接库是一个二进制文件,包含了函数或者模块的机器码。 5. 将生成动态链接库文件放置到C程序的运行路径下,使用时可通过指定库的名字链接到该库。 6. 在C程序中引入头文件,并调用动态链接库中的函数或者模块。 以上是使用GCC编译器创建动态链接库供C程序使用的基本步骤。通过这种方式封装功能,可以实现代码的模块化和重用,提高程序的可维护性和可扩展性。 ### 回答2: 使用者使用动态链接库的主要目的是为了方便地重复使用某些功能代码。在C语言中,可以使用如下步骤来创建并使用动态链接库。 首先,创建动态链接库的源代码文件,该文件包含了要提供的功能代码。可以使用C语言编写这个文件,其中可能包含一些函数和全局变量等。 接下来,使用编译器将源代码文件编译成目标文件。在这个过程中,需要使用适当的编译选项来指定生成动态链接库而不是可执行文件。比如,在GCC编译器中,可以使用"-shared"选项来生成动态链接库。 然后,使用编译器将目标文件链接动态链接库文件。这一步会生成扩展名为".so"(在Linux系统上)或".dll"(在Windows系统上)的文件。在该步骤中,需要提供一些额外的链接选项,以确保正确地生成动态链接库。 最后,使用者可以在自己的C语言程序中引用和使用动态链接库。可以通过在程序中包含相应的头文件并使用相关的函数和变量来调用动态链接库中的功能。 需要注意的是,使用者在编译和链接自己的程序时,需要指定动态链接库的位置和名称,以便在运行时正确加载和使用动态链接库。这可以通过编译选项和链接选项来实现。 总之,通过以上步骤,可以创建一个供C语言程序使用的动态链接库,并在程序中使用其中的功能代码。这样可以提高代码的复用性和可维护性,同时也便于程序的调试和更新。 ### 回答3: 编程语言C中的动态链接库(Dynamic Link Library,简称DLL)是一个可重用的代码和数据集合,可以在不同的程序中被调用。以下是创建动态链接库供C使用的基本步骤: 1. 编写C代码:首先,编写包含所需功能的C代码。将这些代码组织成一个或多个函数,这些函数可以是库的接口。 2. 创建头文件:创建一个头文件(.h文件),其中包含库的函数声明和必要的常量和类型定义。这个头文件将作为客户端程序与动态链接库之间的接口。 3. 编译动态链接库:使用C编译器(例如gcc)将C代码编译成目标文件,使用以下命令生成位置无关的目标文件: ``` gcc -c -fPIC library.c -o library.o ``` 其中,`-c`选项表示只编译不链接,`-fPIC`选项表示生成位置无关的代码,`library.c`是你的源代码文件名,`library.o`是生成的目标文件名。 4. 创建动态链接库:使用以下命令将目标文件创建动态链接库: ``` gcc -shared -o liblibrary.so library.o ``` 其中,`-shared`选项表示生成动态链接库,`-o liblibrary.so`指定输出的库文件名为`liblibrary.so`。 5. 安装动态链接库:将生成动态链接库文件(`liblibrary.so`)复制到系统的默认库目录(例如`/usr/lib`)。使用以下命令: ``` sudo cp liblibrary.so /usr/lib ``` 注意:根据操作系统和环境设置,可能需要提供管理员权限。 6. 使用动态链接库:在你的C程序中,通过包含头文件(步骤2)并使用函数声明来调用动态链接库中的函数。编译时需要链接动态链接库,可以使用以下命令: ``` gcc client.c -o client -llibrary ``` 其中,`client.c`是你的客户端程序源代码文件名,`-llibrary`表示链接名为`liblibrary.so`的动态链接库。 这样,你就成功地创建了一个动态链接库,供其他C程序调用。在客户端程序中,只需要包含头文件并链接动态链接库,就能使用其中定义的函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值