第一:动态库和静态库的生成:

1) 新建一个生成dll工程:

  文件->新建->项目->Win32->Win32控制台应用程序

  输入项目名称:dllTest ,项目路径:D:\VC

  确定

  下一步

  应用程序类型:选择DLL

  完成

2) 编写代码:

2-1) 增加一个头文件:dllTest.h

#define ICILIB_UTIL_API __declspec(dllexport)  //生成动态库时,同时在Debug或Release目录下生成.lib和.dll文件.

class ICILIB_UTIL_API CdllTest  //如果把#define ICILIB_UTIL_API __declspec(dllexport)屏蔽掉.把ICILIB_UTIL_API去掉,编译只会生成.dll而没有.lib文件.
{
public:
 CdllTest();
 ~CdllTest();
public:
 int sum(int a,int b);
};

2-2) dllTest.cpp文件里添加内容:

// dllTest.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "dllTest.h"

CdllTest::CdllTest()
{

}

CdllTest::~CdllTest()
{

}

int CdllTest::sum(int a, int b)
{
 return (a+b);
}

3) 设置生成dll动态库:

  项目->属性->配置属性->常规->配置类型->动态库(.dll)

4) 编译,重新生成(编译信息如下):

1>------ 已启动全部重新生成: 项目: dllTest, 配置: Debug Win32 ------
1>正在删除项目“dllTest”(配置“Debug|Win32”)的中间文件和输出文件
1>正在编译...
1>stdafx.cpp
1>正在编译...
1>dllTest.cpp
1>正在编译...
1>dllmain.cpp
1>正在创建库...
1>生成日志保存在“file://d:\VC\dllTest\dllTest\Debug\BuildLog.htm”
1>dllTest - 0 个错误,0 个警告
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

  这样,就会在D:\VC\dllTest\Debug目录下生成dllTest.lib和dllTest.dll了.

其它) 另:编译静态库时.只需把第3)步改成:项目->属性->配置属性->常规->配置类型->静态库(.lib) 后,重新编译一下就OK了.

  这样,就会在D:\VC\dllTest\Debug目录下生成dllTest.lib(注意.这个.lib与前面动态库的.dll不一样,前者含内容和符号,后者只是符号表明内容在哪里)了.

第二:动态库和静态库的加载:

1) 新建一个测试dll或lib的工程:

  文件->新建->项目->Win32->Win32控制台应用程序

  输入项目名称:dllTest Main,项目路径:D:\VC

  确定

  下一步

  应用程序类型:选择控制台应用程序

  完成

2) 编写代码:

// dllTestMain.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include "../../dllTest/dllTest/dllTest.h" // linux 上用"/",而windows上可用"/"或"\" .

int _tmain(int argc, _TCHAR* argv[])
{
 int c = 0;
 CdllTest t;

c = t.sum(3,2);
 printf("c = %d\n",c);
 return 0;
}

3) 设置生成dll动态库:

  项目->属性->配置属性->链接器->输入->附加依赖项->../../dllTest/Debug/dllTest.lib

  这个lib无论是静态还是动态都是这样加进来.

1>------ 已启动全部重新生成: 项目: dllTestMain, 配置: Debug Win32 ------
1>正在删除项目“dllTestMain”(配置“Debug|Win32”)的中间文件和输出文件
1>正在编译...
1>stdafx.cpp
1>正在编译...
1>dllTestMain.cpp
1>正在编译资源清单...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>正在链接...
1>LINK : 没有找到 D:\VC\dllTestMain\Debug\dllTestMain.exe 或上一个增量链接没有生成它;正在执行完全链接
1>   正在创建库 D:\VC\dllTestMain\Debug\dllTestMain.lib 和对象 D:\VC\dllTestMain\Debug\dllTestMain.exp
1>正在嵌入清单...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>生成日志保存在“file://d:\VC\dllTestMain\dllTestMain\Debug\BuildLog.htm”
1>dllTestMain - 0 个错误,0 个警告
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

5)用cmd程序 运行:

5-1) 动态库时:

  会弹出"没有找到 dllTest.dll,因此这个应用程序未能启动.重新安装应用程序可能修复此问题"的对话框.

  是因为没有找到动态库.需要把刚才生成的dllTest.dll放到dllTestMain.exe同一个目录下.再运行.发现运行成功.

5-2) 静态库时:

  运行成功

VS2008 动态库和静态库的生成和加载的更多相关文章

  1. gcc编译工具生成动态库和静态库之一----介绍

     1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...

  2. 如何使用GCC生成动态库和静态库

    根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行.而动态库是在程序执行的时候被链接的.程序执行完,库仍需 ...

  3. Linux下动态库和静态库的生成和使用

    1.准备头文件和源文件 hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name): #endif hello.c #in ...

  4. 【C++】如何使用GCC生成动态库和静态库

    一.静态库和动态库的定义及区别 程序编译的四个过程: 1.预处理  展开头文件/宏替换/去掉注释/条件编译(.i后缀) 2.编译    检查语法,生成汇编(.s后缀) 3.汇编    汇编代码转换成机 ...

  5. gcc编译工具生成动态库和静态库

    一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...

  6. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  7. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  8. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  9. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

随机推荐

  1. 016_openxml_forxml

    016_openxml_forxml --openxml*********************************************************************** ...

  2. Android Studio使用教程图文详解

    谷歌表示Android Studio 1.0 能让开发者“更快更有生产力”,并认为它可以代替 Eclipse,同时为Eclipse 用户提供迁移步骤.代码自动提示.运行响应速度.都比Eclipse来的 ...

  3. [转]MySQL导入和导出SQL脚本

    首先,使用mysqldump命令的前提是,在Cmd中进入mysql安装目录下的bin目录下,才可以使用该命令.我的mysql安装在E:盘,所以,首先进入bin目录下:E:/Program Files/ ...

  4. XML约束

    XML约束--能够看懂约束内容,根据约束内容写出符合规则的xml文件. DTD约束 1)导入dtd方式 内部导入 <!DOCTYPE note [ <!ELEMENT note (to,f ...

  5. Hibernate 一对多双向关联Demo

    以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { privat ...

  6. 修改一行SQL代码 性能提升了N倍

    在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用EXPLAN ANALY ...

  7. TIMESTAMP和DATETIME的区别

    TIMESTAMP和DATETIME的区别 1. 存储空间不同 a) TIMESTAMP占用4个字节 b) DATETIME占用8个字节 2. 受时区影响 c) TIMESTAMP实际记录的是1970 ...

  8. date命令详解与练习

    date : 用来打印或设置系统日期和时间. 它在linux shell编程中经常会用到.比如每天生成随日期变化的档案名,尤其在银行业务中每天都会生成流水文件.eg:datefile=$(date & ...

  9. grails-MappingException: Could not determine Type

    在用grails的时候遇到这个问题,反复调试了很久,没有进展,同时敲了几个命令后好了,真纠结,这是框架的问题吗? 问题: Caused by MappingException: Could not d ...

  10. hdu1003 Max Sum(经典dp )

      A - 最大子段和 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descr ...