2023年12月11日发(作者:)

VS2017生成动态库.dll和静态库.lib及其调用

VS2017生成动态库.dll和静态库.lib及其调用步骤

1.打开VS2017,新建动态链接库(DLL)

2.新建头文件–标头.h

头文件中先不用写内容

3.新建源文件–源.cpp

3.1 包含头文件

#include "stdafx.h"

#include "标头.h"

3.2 自定义函数

int funAdd(int a, int b)

{

return (a + b);

}

源.cpp --源码如下:

#include "stdafx.h"

#include "标头.h"

int funAdd(int a, int b)

{

return (a + b);

}

4.打开头文件,添加如下语句(自己写的自定义的函数)

#ifndef _TESTDLL_H_

#define _TESTDLL_H_

__declspec(dllexport) int funAdd(int a, int b);

#endif

头文件中的 ifndef/define/endif 作用?

在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义

的错误。在头文件中使用#ifndef #define #endif能避免头文件的重定义。

方法:例如要编写头文件test.h

在头文件开头写上两行:

#ifndef _TEST_H

#define _TEST_H//一般是文件名的大写

头文件结尾写上一行:#endif

这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。

分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,

当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和#endif之间的代码也就不会再次被包含,这样

就避免了重定义了。主要用于防止重复定义宏和重复包含头文件。

5.菜单栏–生成–生成解决方案(F7)

生成成功后,右键解决方案在文件资源管理器中打开文件夹(自己新建项目时的路径),在Debug目录中就可以看到生成的.dll和.lib文件

6.接下来重新建一个空项目

7.把头文件(标头.h)和生成的.dll及.lib文件拷贝到【6】新建项目的文件夹中

在 源.cpp中添加内容如下:main函数中调用自定义函数

#pragma comment(lib,"")

#include

#include "TestDLL.h"

int main()

{

int a = 5, b = 6;

int c = funAdd(a, b);

printf("c=%d", c);

getchar();

}

注:pragma comment(…)该指令将一个注释记录放入一个对象文件或可执行文件中。 常用的lib关键字,可以帮我们连入一个库文

件。

和在工程设置里写上链入的效果一样(两种方式等价,或说一个隐式一个显式调用),不过这种方法写的程序别人在使用

你的代码的时候就不用再设置工程settings了。告诉连接器连接的时候要找,这样你就不用在linker的lib设置里指定这个

lib了。

#pragma comment( comment-type [,“commentstring”] )

该宏放置一个注释到对象文件或者可执行文件。comment-type是一个预定义的标识符,指定注释的类型,应该是

compiler,exestr,lib,linker之一。commentstring是一个提供为comment-type提供附加信息的字符串,

Remarks:

1、compiler:放置编译器的版本或者名字到一个对象文件,该选项是被linker忽略的。

2、exestr:在以后的版本将被取消。

3、lib:放置一个库搜索记录到对象文件中,这个类型应该是和commentstring(指定你要Liner搜索的lib的名称和路径)这个库的

名字放在Object文件的默认库搜索记录的后面,linker搜索这个库就像你在命令行输入这个命令一样。你可以在一个源文件中设置多

个库记录,它们在object文件中的顺序和在源文件中的顺序一样。如果默认库和附加库的次序是需要区别的,使用Z编译开关是防止默

认库放到object模块。

4、linker:指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。

+F5

成功!

注:生成的.exe文件可直接运行。