首先明确这篇文章的目的,我希望大家能够通过这篇文章了解一下如何在实际工作中创建和使用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静态链接库的更多相关文章

  1. VC++:创建,调用Win32静态链接库

    概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类. 仓库的发展史经历了"无库" ---& ...

  2. Windows 下动态链接库和静态链接库

    1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快. 缺点在于一套代码可能在内存中有多份拷贝,占用内存. 2.动态链接库:库由windos api加载库代码,内存中只有一 ...

  3. 利用CMake自己创建OpenCV静态链接库

    1.准备工作: 1)完成Visual Studio2012安装: 2)下载并解压CMake3.5.0: 3)下载并解压OpenCV2.4.12: 4)下载并解压TBB44_20160128oss. 2 ...

  4. Qt 共享库(动态链接库)和静态链接库的创建及调用

    前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...

  5. Qt之创建并使用静态链接库

    1.创建静态链接库 静态库的工程名字 添加包含的模型 更改一下类的名字 我的静态编译库的工程. 写一个简单的静态哭的代码为后面测试静态库使用 cpp代码: #include "staticb ...

  6. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  7. VS2010创建C++静态链接库创建和使用

    VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...

  8. go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2]

    go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2].想要产生dll,可以这样 workaround ,参考 golang [issuse#11058][ ...

  9. C/C++ 静态链接库(.a) 与 动态链接库(.so)

    平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...

随机推荐

  1. 命令行下运行php的方法和技巧

    linux中直接用"php"命令来执行php文件 一般在linux命令行下运行php文件的代码: XML/HTML代码 linux下执行:#php安装路径 -f php文件路径 例 ...

  2. PHP脚本redis类的实例源码

    class redisDB{         private $redis; //redis对象             /**      * 初始化Redis      * $config = ar ...

  3. webserer错误

    HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理. 解决方法: C:\Program Files\Microsoft Visual Stu ...

  4. android导入项目出现style错误,menu错误

    android导入项目出现style错误,menu错误 style //查看 res/values/styles.xml 下的报错点. <style name="AppBaseThem ...

  5. VC++ 线程同步 总结

    注:所谓同步,并不是多个线程一起同时执行,而是他们协同步调,按预定的先后次序执行. 与线程相关的基本函数包括:CreateThread:创建线程CloseHandle:关闭线程句柄.注意,这只会使指定 ...

  6. POJ 1840 Eqs 暴力

      Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The ...

  7. MySQL(七) —— MySQL存储过程 & 存储引擎

    MySQL中输入语句的执行过程: 如果我们可以将上面的过程简化,吧语法分析或者编译等步骤简化,则可以将整个流程简化. 存储过程: 是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理: ...

  8. TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. C#中Application.DoEvents()的作用

    Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息. 交出CPU控制权,让系统可以处理队列中的所有Windows消息,比如在大运算量循环内,加Application. ...