专栏首页Aloys的开发之路创建和使用Windows静态链接库

创建和使用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;

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PDF常见问题总结

    Acrobat保存PDF文档报错“读取本文档时出现问题(135)” 用Acrobat修改PDF文档,保存的时候报错:“文档无法保存。读取本文档时出现问题(13...

    用户1221057
  • 如何在大量jar包中搜索特定字符

    工作中定位某些问题时需要在jar包中搜索某些特定的字符。如果jar包数量比较少可以直接使用JD-GUI等反编译软件导出源码,但是如果jar包数目庞大,这种方式工...

    用户1221057
  • javadoc相关问题

    src源代码生成html格式文档:http://www.cnblogs.com/shenliang123/archive/2012/04/23/2466483....

    用户1221057
  • Jmeter(九)_获取JDBC响应做接口关联

    http://www.cnblogs.com/Zfc-Cjk/p/8295495.html

    飞天小子
  • 杨老师课堂_Java教程第二篇之变量及运算符

     * c: 变量使用时有作用域的限制。 public static void main(String[]...

    杨校
  • Uva_11462 GCD - Extreme (II)

      给定一个n, 求:GCD(1, 2) + GCD(1, 3) + GCD(2, 3) + …… + GCD(1, n) + GCD(2, n) + …… +...

    若羽
  • 事务的处理

    事务应该是数据库提供给应用程序的,并且为了隐藏并行问题和软硬件会发生的错误,而使用的一种抽象。下图中提到的方法包含了几个前提,那就是时钟是相对可靠的...

    哒呵呵
  • Andrew Ng - 《Machine Learning Yearning》 Chapter 23-27

    Machine Learning Yearning. 全新版本 本书作者是Andrew NG

    YingJoy_
  • 手写一个orm框架-7

    上一篇讲了怎样生成一个sql中where的一部分,之后我们要做事情就简单很多了,就只要像最开始一样的生成各种sql语句就好了,之后只要再加上我们需要的条件,一个...

    何白白
  • 用户管理上

    第1章 查看ip的其他方法  ip 1.1 ip address == ip a 查看所有的网卡信息。 [root@znix ~]# ip a 1: lo: <...

    惨绿少年

扫码关注云+社区

领取腾讯云代金券