windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)

kato-megumi 2021-06-15 原文


windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)


在前面的文章中,介绍了 windows 命令行下关于 cl.exe 的安装和使用方法,有时候,在程序中会链接静态库,也会根据需要生成静态库。这些工作当然可以通过 VS 的界面操作来实现,同时,也可以使用命令行实现。在 VS 的界面中,可以使用链接器选项导入所要链接的静态库的路径,在命令行下,它对应的是 link.exe。如果按照上期文章的做法对电脑进行了配置的话,link.exe 也是可以顺利使用的。下面,通过一个简单的例子来看下它的具体用法:

1 //hello.h
2 #ifndef _HELLO_H_
3 #define _HELLO_H_
4 #include <stdio.h>
5 #include <stdlib.h>
6 
7 void hello(const char *strName); 
8 
9 #endif     //_HELLO_H_
1 //hello.c
2 #include "hello.h"
3 void hello(const char *strName)
4 {
5       printf("hello %s\n", strName);
6 }

现在要将上面的代码生成一个静态库,供接下来的程序调用。首先通过 cl.exe 的 -c 参数对上面的 .c 文件进行编译,生成 .obj 文件,再使用 lib.exe 结合 .obj 文件生成 .lib 文件。如下图所示:

可以看到,这个时候就有了 hello.lib 静态库了。下面写个程序对这个静态库进行调用:

1 //main.c
2 #include "hello.h"
3 
4 int main()
5 {
6     hello("world");
7     return 0;
8 }

现在要使用 link.exe 将静态库链接到上面的程序中,在这之前,要先将 main.c 编译生成 .obj 文件,整个过程如下图所示:

link.exe 的 -libpath 参数可以指定链接的库文件,它也可以写成 /LIBPATH,具体使用哪个写法看个人习惯了。经过这个编译、链接的过程之后,就可以生成可执行文件,运行之后就可以输出 hello world 了。以上的示例比较简单,下面展示一个稍微复杂点的例子,在这个例子中,将用到两个函数接口,一个是计算整数的阶乘,另一个是计算 Gegenbauer 多项式的值。它们分别存放于不同的文件夹下面,这样每个文件夹下都是一个独立的模块,最后被主程序调用。

 1 //factorial.h
 2 #ifndef _FACTORIAL_H_
 3 #define _FACTORIAL_H_
 4 
 5 #include <stdio.h>
 6 #include <math.h>
 7 #include <stdlib.h>
 8 
 9 int fac(int n);
10 
11 #endif    //_FACTORIAL_H_
 1 //factorial.c
 2 #include "factorial.h"
 3 
 4 int fac(int n)
 5 {
 6     if (n == 0 || n == 1)
 7     {
 8     return 1;
 9     }
10     else
11     {
12     return n * fac(n - 1);
13     }
14 }
 1 //gegenbauer.h
 2 #ifndef _GEGENBAUER_H_
 3 #define _GAGENBAUER_H_
 4 
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <math.h>
 8 
 9 float gegenbauer(float alpha, int n, float x);
10 
11 #endif    //_GEGENBAUER_H_
 1 //gegenbauer.c
 2 #include "gegenbauer.h"
 3 
 4 float gegenbauer(float alpha, int n, float x)
 5 {
 6     if (n == 0)
 7     {
 8     return 1;
 9     }
10     else if (n == 1)
11     {
12     return 2 * alpha * x;
13     }
14     else
15     {
16     return 1./ n * (2 * x * (n + alpha - 1) * gegenbauer(alpha, n - 1, x) - (n + 2 * alpha - 2) * gegenbauer(alpha, n - 2, x));
17     }
18 }

按照前面介绍的方法可以先在相应的文件夹下分别生成 factorial.lib 和 gegenbauer.lib,主程序代码如下:

 1 //main.c
 2 #include "factorial.h"
 3 #include "gegenbauer.h"
 4 
 5 int main()
 6 {
 7     int n = 3;
 8     float alpha = 0.5, x = 2.0;
 9 
10     printf("factorial(%d): %d\n", n, fac(n));
11     printf("gegenbauer(%f, %d, %f): %f\n", alpha, n, x, gegenbauer(alpha, n, x));
12 
13     return 0;
14 }

编译 main.c 的时候需要指定包含的头文件所在的目录,可以使用 cl.exe 的 -I 参数,链接过程和前面介绍的没有太大的区别,整个过程如下图所示:

以上就是关于命令行下使用 VS 生成静态库并调用的介绍,这些都是通向编写 makefile 所必须要经过的途径,如果您对本文介绍的内容感兴趣,欢迎和本小姐交流。

发表于
2021-06-15 13:52 
yasumi 
阅读(0
评论(0
编辑 
收藏 
举报

 

版权声明:本文为kato-megumi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kato-megumi/p/14884702.html

windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)的更多相关文章

随机推荐

  1. PostgreSQL优点特性

    PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统, 它提供了多版本并行控制,支持几乎所有 […]...

  2. 【翻译】C#编程语言和JAVA编程语言的比较(下)

    原文地址:http://www.25hoursaday.com/CsharpVsJava.html   6、集 […]...

  3. python 2.7 数据结构之列表list: 基础面试总结

    python 列表函数及方法:  函数如下: 1 cmp(list1,list2) 比较两个列表中的元素 2 […]...

  4. SVN下载安装

    1.直接进入官网:https://tortoisesvn.net/downloads.html  进行下载   […]...

  5. JavaScript教程

    目录js简介js基础知识注释变量与常量数据类型数值number字符串string字符串的诸多方法字符串格式化输出布尔值booleannull和undefined对象object自定义对象(字典)日期对象JSON序列化数组运算符算数运算符比...

  6. 小白学Python(8)——pyecharts 入门

    简介: pyecharts 是一个用于生成 Echarts 图表的类库。  echarts 是百度开源的一个数 […]...

  7. 【Proteus+51单片机学习笔记】-51/52系列单片机简介

    0 摘要     本文主要对STC89C52系列单片机进行了简单介绍,对其主要电路进行整理。 1 STC89C […]...

  8. GSM Arena 魅族mx四核评测-个人翻译

    Meizu MX 4-core review: Twice the power  魅族MX四核评测:两倍动力 […]...

展开目录

目录导航