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,"TestDLL.lib")
#include <stdio.h>
#include "TestDLL.h"
int main()
{
int a = 5, b = 6;
int c = funAdd(a, b);
printf("c=%d", c);
getchar();
}
注:pragma comment(…)该指令将一个注释记录放入一个对象文件或可执行文件中。 常用的lib关键字,可以帮我们连入一个库文件。
和在工程设置里写上链入TestDLL.lib的效果一样(两种方式等价,或说一个隐式一个显式调用),不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了。告诉连接器连接的时候要找TestDLL.lib,这样你就不用在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:指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。
8.Ctrl+F5
成功!
注:生成的.exe文件可直接运行。