zoukankan      html  css  js  c++  java
  • 静态库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; }
    ....

  • 相关阅读:
    结构体和枚举
    [转载]玩转Asp.net MVC 的八个扩展点
    SQLServer处理亿万级别的数据的优化措施
    Lambda表达式
    匿名类型
    单例模式——懒汉式和饿汉式详解
    Cglib动态代理实现原理
    集合的子集
    深入剖析ThreadLocal
    java注解的自定义和使用
  • 原文地址:https://www.cnblogs.com/flowingwind/p/8306844.html
Copyright © 2011-2022 走看看