ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-06-15 14:02:57  阅读:200  来源: 互联网

标签:exe gegenbauer cl windows int alpha include hello 进阶


在前面的文章中,介绍了 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 所必须要经过的途径,如果您对本文介绍的内容感兴趣,欢迎和本小姐交流。

标签:exe,gegenbauer,cl,windows,int,alpha,include,hello,进阶
来源: https://www.cnblogs.com/kato-megumi/p/14884702.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有