静态库lib、动态库dll基础

首先从hello world!开始

//main.cpp文件

void cpu();
int main()
{
    put();
    return 0;
}

在main.cpp中定义了一个cpu();函数,但没有实现其功能,现在将其功能在自己写的库中实现输出hello world!

//cputdll.cpp
#include <iostream> using namespace std; __declspec(dllexport) void put() { cout << "hello my first dll" << endl; }

功能实现函数;(静态链接库方式实现

在vs命令行中编译main.cpp到目标文件main.obj

cl -c main.cpp

编译cputdll.cpp到目标文件cputdll.obj目标文件并且连接生成静态库.lib

cl -c cputdll.cpp
lib cputdll.obj cputdll.lib

将主文件与静态库连接生成可执行.exe文件

link main.obj cputdll.lib

运行main.exe 输出 hello world!(静态库输出hello world!)

动态链接方式:

cl -c main.cpp     //生成main.obj
cl -c cputdll.cpp //生成cputdll.obj
cl /LD cputdll.obj //生成cputdll.lib(此时的lib只记录接口信息)与cputdll.dll
link main.obj cputdll.lib //连接生成可执行main.exe

运行main.exe 输出 hello world!(动态库输出hello world!)

为什么要用库呢?

一、概念

DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。

优点

(1)节省内存和代码重用:当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载代码的重复量,且有助于代码的重用。

(2)模块化:DLL有助于促进模块式程序开发。模块化允许仅仅更改几个应用程序共享使用的一个DLL中的代码和数据而不需要更改应用程序自身。这种模块话的基本形式允许如Microsoft Office、Microsoft Visual Studio、甚至windows自身这样大的应用程序 使用较为紧凑的补丁和服务包。

二、编写

__declspec(dllexport)放在函数头,标示该函数是外部引用函数所以库能被其它程序调用的先决条件;但往往一个库中有多个函数;所以会把函数定义在一个头文件中;如上程序可以这样改写
///////////main.cpp文件
#include "cputdll.h"int main()
{
    put();
    return 0;
}
///////////cputdll.h
__declspec(dllexport) void cpu();

..
///////////cputdll.cpp
#include <iostream> using namespace std; void put() { cout << "hello my first dll" << endl; }
....

posted @ 2018-01-19 19:05  疯颠研究者  阅读(1144)  评论(0编辑  收藏  举报