环境:visual studio 2019
本篇主要描述怎么创建一个dll库,然后用隐式链接的方式让exe链接dll。
以下内容假设已经知道C艹的动态库基本概念,和一些基本的C艹语法。
项目结构
demo项目有两个部分,
· app
· mathlib
mathlib只提供一个简单的方法power(),app直接调用这个方法返回一个数的平方。
main.cc
#include <iostream>
#include "Math.h"
using namespace std;
int main(int argc, char const *argv[])
{
int a = 2;
cout<< "power by <math>: " << power(a) << endl;
return 0;
}
Math.h
#ifndef DEMO_MATH_LIB
#define DEMO_MATH_LIB
#ifdef __cplusplus
extern "C"{
#endif
_declspec(dllexport) int power(int a);
#ifdef __cplusplus
}
#endif
#endif //DEMO_MATH_LIB
Math.cpp
#include "Math.h"
#include <iostream>
using namespace std;
int power(int a)
{
cout << "using custom power" << endl;
return a * a;
}
Math.h中出现了很多宏定义,具体是什么含义不是本篇的内容重点,会另起一篇来具体分析。这里我们只从操作性角度来介绍,用人话来说这就是一篇操作手册。
创建dll项目
visual studio 2019的项目是以solution来划分的,我们这里先创建一个dll的 sln。
创建新项目
填写项目名
之后点创建就完了
删除自带的dllmain.cpp文件
一般创建的dll项目会自带 dllmain.cpp,是默认用来做dll入口的。我们这里不需要,把它删掉就完了。同时删掉的还有framework和pch
添加src和header
选择现有项,
添加lib文件进去,然后稍微调下位置,头文件放头文件目录下,不放也没所谓。
修改预编译头
右键math_lib,属性,进去C/C++的预编译头里,关掉预编译头选项。否则你编译会出现下面的错误,
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h””?
生成
右键math_lib项目然后点生成,就可以产出dll文件了。
dll是在exe启动的时候会去加载的动态链接库。
lib也是我们需要的,它是静态库,在编译exe的时候需要用来做静态符号链接,但它不会编进exe里。
创建exe项目
这次我们要创建控制台应用
删除自带文件,添加我们的
下面的操作跟dll的操作差不多,添加完main.cc后差不多这个样子
添加编译依赖的头文件和lib文件
添加前需要把Math.h复制到main.cc的同个目录,然后添加到头文件里。不然编译的时候会发生找不到符号错误。
添加完差不多这样子
编译生成
生成的结果,
现在我们有了exe了,但运行的话会直接调出进程。
因为目录下没有dll文件。复制过来就行了。