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

Posted yasumi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 所必须要经过的途径,如果您对本文介绍的内容感兴趣,欢迎和本小姐交流。

以上是关于windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)的主要内容,如果未能解决你的问题,请参考以下文章

配置Windows下编译运行C/C++过程

Visual C++/C# 中的 WinForms 编程与 Visual C++(MFC) 中的 Windows 编程有何不同

使用VS自带OpenMP时出现“错误 MSB6006 CL.exe 已退出,代码为2”

C语言02-第一个C程序

linux下C++开发工具

Service与Android系统设计--- Native Service