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)的程序那些猫腻. ...
随机推荐
- [技术翻译]Guava-libraries(一): 用户指导
用户指导 本文翻译自http://code.google.com/p/guava-libraries/wiki/GuavaExplained,由十八子将翻译,发表于博客园 http://www.cnb ...
- Rabbitmq init terminating in do boot 问题
其实出现这个问题的原因很简单,就是rabbitmq的安装目录中是不能带空格的,但是官方安装包会默认的将我们的程序安装到Program Files下,哭晕啊有没有.所以,我们将rabbitmq从D:\P ...
- js Math函数
1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.fl ...
- Thinkphp 表单验证
在服务器端通过tp框架实现表单验证 用户名.密码.重复密码.邮箱.qq.手机号码.爱好.学历 具体步骤: 制作表单 表单form数据通过create()方法收集(验证功能要求我们必须通过create( ...
- 手把手教你使用python复杂一点点的装饰器
#只要@deco后面跟括号,都要 先传装饰器参数,返回 再传目标待装饰函数,返回 传目标函数的参数 #这个参数可以是类 def deco(arg):#装饰器的函数在这里传 print('0',arg) ...
- 欧几里德算法gcd及其拓展终极解释
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解 扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...
- poj1159 Palindrome
G - 回文串 Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descripti ...
- Oracle的Net Configuration Assistant 配置
在进行团队开发的时候,一般团队的每一个人只需要安装一个客户端即可,没有必要安装一个Oracle 数据库服务器,而数据库服务器是属于共享的,此时,我们就需要配置客户端.客户端的配置可以有以下两种方式:第 ...
- Python中函数参数传递问题
先上两个例子: http://python.jobbole.com/85231/ a = 1 def fun(a): a = 2 fun(a) print a # 结果为1 fun(a)中的a,可以看 ...
- C# 部分关键字
关键字: virtual: 虚方法,本身可以被实例化,也可以在派生类中重写该方法: override:在派生类重写基类虚方法时声明,避免了C++中的潜在运行错误: abstract:声明为抽象类.抽 ...