VS2008 动态库和静态库的生成和加载
第一:动态库和静态库的生成:
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 动态库和静态库的生成和加载的更多相关文章
- gcc编译工具生成动态库和静态库之一----介绍
1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...
- 如何使用GCC生成动态库和静态库
根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行.而动态库是在程序执行的时候被链接的.程序执行完,库仍需 ...
- Linux下动态库和静态库的生成和使用
1.准备头文件和源文件 hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name): #endif hello.c #in ...
- 【C++】如何使用GCC生成动态库和静态库
一.静态库和动态库的定义及区别 程序编译的四个过程: 1.预处理 展开头文件/宏替换/去掉注释/条件编译(.i后缀) 2.编译 检查语法,生成汇编(.s后缀) 3.汇编 汇编代码转换成机 ...
- gcc编译工具生成动态库和静态库
一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
随机推荐
- hibernate_validator_07
一.校验组序列 默认情况下,约束的验证是没有一定的顺序的,不管他们是属于哪个认证组的.但是在有些环境中,我们控制这些约束验证的顺序还是很有用的. 就拿我们上一个例子来说,我们可以这样:首先在我们检查车 ...
- MESH
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_meshtest.html A class that allows c ...
- [C++] namespace相关语法
本段测试代码包括如下内容: (1) 如何访问namespace中声明的名称:(2) namespace导致的相关冲突:(3) namespace可嵌套:(4) 可以在namespace中使用using ...
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...
- Open vSwitch在openstackHavana概述
最近再看Open vSwitch一些东西,我认为openstack官网上对这一块做了一些了解,所以就把这一块翻译出来以供参考,英语不好,翻译得很粗糙. Open vSwitch插件是最有名的核心插件之 ...
- Java学习----不变的常量
byte: -128~+127 short int:129 long float:1.5f (1.5被系统默认为double) double:4.5d char:'s' '1' boolean:t ...
- underscorejs-each学习
2.1 each 2.1.1 语法: _.each(list, iteratee, [context]) 2.1.2 说明: 依次对集合的所有元素进行某种操作,原样返回list.接收3个参数,list ...
- 请给出异步加载js方案
请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...
- 转:Python 与 Excel 不得不说的事
数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件.因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道. 如果仅仅是要以表单形式保存数据,可以借助 ...
- Python新手学习基础之函数-lambda函数
lambda函数 在Python里除了用def定义函数外,还有一种匿名函数,也就是标题所示的lambda函数,它是指一类无需定义标识符(函数名)的函数或子程序. lambda函数的使用语法如下: la ...