创建和使用Windows静态链接库
首先明确这篇文章的目的,我希望大家能够通过这篇文章了解一下如何在实际工作中创建和使用Windows平台下的静态链接库。关于链接库的概念,希望大家参考维基百科”Library”词条(英文版),介绍的很全面,措辞也很严谨。远比你从网上东看西逛来的迅捷。文中对动态链接库和静态链接库的区别以及Windows平台和Linux平台的具体实现都做了很详细的说明。什么时候该用动态库,什么时候该用静态库也可以从中得到结论。所以我就不谈哪个好,哪个不好了。我只假设这样一种情况,你已经确定要创建、使用Windows的静态链接库,但却不知道如何操作,本篇文章的用意仅在于此。
另外顺便说一下,如果你想了解Windows下的动态链接库的创建和使用,你可以参考孙鑫老师的《VC++深入详解(修订版)》中的相关章节,里面介绍的也很系统,而且涉及一些原理介绍。如果你想了解Linux下静态链接库、动态链接库的创建和使用你可以在阅读刚才提到的维基百科”Library”词条(英文版)的基础上阅读我的后续博客内容。
这里说明一下,我所使用的系统为Windows 8.1 x64,所使用的编译器为VS 2012。其它类似环境的操作不难从本文推出。但有一点我想说明,既然你选择Windows下的静态链接库,那么我推荐你使用微软体系的编译器,无论是VC6.0还是后来的VS,都没有关系。但最好不要使用其它编译器。我不是说它们不如微软体系的编译器好,而是因为库文件这个东西很依赖于系统实现,Windows就是微软开发的,许多该平台上库的实现都是以微软为标准,所以其兼容性最好。当然如果你要使用linux下的动态、静态链接库,我就会推荐你使用gcc编译器,其对linux平台的兼容性最好。
下面开始正文,首先在VS中新建一个名称为libjiangxin的static library工程,并新建libjiangxin.h和libjiangxin.cpp两个文件,源代码如下:
//文件:libjiangxin.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
#endif
//文件:libjiangxin.cpp
#include "libjiangxin.h"
int add(int x,int y)
{
return x + y;
}
注意如果你使用VS2012的话,你还可以直接将libjiangxin.h中的代码改为:
#pragma once
extern "C" int add(int a,int b);
编译这个工程就得到了一个.lib文件,具体生成位置随编译器版本不同而不同,你可以在你的工程目录下仔细找找,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。下面来看看怎么使用这个库,在libjiangxin工程所在的工作区(解决方案)内新建一个libTest工程。libTest工程仅包含一个test.cpp文件,它演示了静态链接库的调用方法,其源代码如下:
#include <stdio.h>
//Libjiangxin.h文件的所在位置,可能与我的不同
#include "..\\Libjiangxin\\Libjiangxin.h"
//指出本文件生成的.obj文件应与libjiangxin.lib一起连接,具体位置可能与我的不同
#pragma comment(lib, "..\\Debug\\libjiangxin\\libjiangxin.lib")
int main()
{
printf( "2 + 3 = %d", add( 2, 3 ) );
return 0;
}
创建和使用Windows静态链接库的更多相关文章
- VC++:创建,调用Win32静态链接库
概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类. 仓库的发展史经历了"无库" ---& ...
- Windows 下动态链接库和静态链接库
1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快. 缺点在于一套代码可能在内存中有多份拷贝,占用内存. 2.动态链接库:库由windos api加载库代码,内存中只有一 ...
- 利用CMake自己创建OpenCV静态链接库
1.准备工作: 1)完成Visual Studio2012安装: 2)下载并解压CMake3.5.0: 3)下载并解压OpenCV2.4.12: 4)下载并解压TBB44_20160128oss. 2 ...
- Qt 共享库(动态链接库)和静态链接库的创建及调用
前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...
- Qt之创建并使用静态链接库
1.创建静态链接库 静态库的工程名字 添加包含的模型 更改一下类的名字 我的静态编译库的工程. 写一个简单的静态哭的代码为后面测试静态库使用 cpp代码: #include "staticb ...
- Linux环境下c语言静态链接库和动态链接库创建和使用
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...
- VS2010创建C++静态链接库创建和使用
VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...
- go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2]
go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2].想要产生dll,可以这样 workaround ,参考 golang [issuse#11058][ ...
- C/C++ 静态链接库(.a) 与 动态链接库(.so)
平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...
随机推荐
- Linux 常见的trouble shooting故障排错
Linux 常见的trouble shooting故障排错 备份开机所必须运行的程序对一个运维人员来说是非常有必要的.在实际生产环境中,系统和数据基本都是安装在不同的硬盘上面,因为企业最关心的还是数据 ...
- MUI 页面传值 webview
我们假设a.html 和b.html a.html 页面代码 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- MSM8974 fastboot烧写软件
fastboot烧写是在aboot阶段做的,所以空板没有完整烧写aboot及其boot sequence前的image是没法使用fastboot的.在手机开机状态下,执行: adb re ...
- SQL数据库约束行为---防止数据完全重复
防止同一条数据完全重复: 一.主关键字约束:主键约束.1.能够唯一的区分每一行数据.——不许重2.表中的数据按照主键字排序的.——有序3.主键字不能为空——不为空4.一个表只能有一个主键,但可以设置组 ...
- Cheatsheet: 2013 12.17 ~ 12.31
.NET Introducing ASP.NET Web API Throttling handler C# async and await: A Deeper Dive PARALLEL PROGR ...
- thinkphp的自动完成功能说明
手册里有一句话很关键: 自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理. 这句话说明自动完成发生的时间是create()组建数 ...
- CentOS 7下编译FreeSWITCH 1.6
安装背景: 已经最小化安装CentOS 7. 准备工作: 挂载安装光盘,配置yum本地化安装,配置方法可以参考http://www.cnblogs.com/yoyotl/p/4877439.html. ...
- Django 过滤器 实例
实例1 safe让Html标签以及一些特殊符号(如<)生效,下面以例子说明: # value = '<b>CPT</b>' # 那么输出的时候,CPT就是加粗的,如果不加 ...
- servlet&jsp高级:第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- HTML笔记(四) 框架
通过框架,可以在一个窗口显示多个页面.而所谓的框架,就是指每一份HTML文档. 框架结构标签<frameset> 定义如何将窗口分割为框架. frameset定义了一系列的行列. rows ...