windows系统中的c/c++设计——cl与link的进阶(生成静态库并调用)
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 所必须要经过的途径,如果您对本文介绍的内容感兴趣,欢迎和本小姐交流。