C语⾔怎么调⽤开源库-(GitHub开源库的编译、调⽤)vscode命令⾏开发-
visua。。。
之前我写过⼀篇类似的博⽂,但是当时对这个内容理解还不是很透彻,因此写的很随意,也不成体系。
这次因为对⼀个很感兴趣,所以想借着这个机会,实战演练⼀下怎么使⽤⽹上的开源库。
1. C语⾔项⽬开发分类
对于C语⾔项⽬开发来说,我们可以将其分类成以下⼏种情况:
1. 单⽂件开发
这种情况在项⽬中是很少的,常见于我们刷leetcode时,或者验证算法的时候。此时源⽂件只有⼀个,且不依赖其他库(C语⾔标准库除外)。
2. 单⽂件开发,但是调⽤开源库
这个其实和后⾯要说的(多⽂件开发,调⽤开源库)其实是类似的,后⾯我们再细说。
3. 多⽂件开发,但⽂件数⽬也没有太多,且没有调⽤开源库。
⼀般其⽬录结构如下:
—src
—a.c
—b.c
— …
—include
—a.h
—b.h
— …
–main.c
在这种情况下,我们⼀般会采取模块化的开发⽅式,⼀般⼀个模块包括⼀个.c⽂件和.h⽂件,当然也可
能⼀个模块由⼏个.c⽂件组成,但⼀般⼀个模块只有⼀个.h⽂件,.h⽂件其实就是该模块向外提供的接⼝;也有的模块只有.h,定义⼀些数据变量给其他模块使⽤。
没有调⽤开源库,整个源代码只是调⽤了标准库或者⾃⾝模块提供的接⼝,因此在编译上也没有太多需要主要的点。
4. 多⽂件开发,且调⽤开源库
这种情况应该是在实际的项⽬中最常见的。当我们要实现某个功能时,发现已经有优秀的开源库可以实现这个功能,这时就没必要重复造轮⼦,直接调⽤该开源库即可。
⼀般其⽬录结构如下:
—src
—a.c
—b.c
— …
—
include
—a.h
—b.h
— …
main.c
除了这些⾃⾝的源⽂件以外,我们还需要调⽤开源库。
在此说⼀下开源库的存在形式。
开源库是有源代码的,我们如果要使⽤该开源库,可以开源库作为⼀个模块,把源代码⽂件复制到我们的项⽬中,假设开源库包括module.c和module.h,复制过去之后,⽂件⽬录变成如下:
—src
—a.c
—b.c
— module.c
— …
—include
—a.h
—b.h
— modele.h
— …
main.c
这种⽅法优点是易于理解,但是当开源库源代码⽂件较多时,直接复制过去容易和原有源代码⽂件杂糅在⼀起,不好管理。从实际上看,我们其实也不需要对开源库的源⽂件,我们只是想和使⽤C语⾔标准库⼀样调⽤接⼝就⾏了。
因此我们⼀般会将开源库编译成库⽂件给我们调⽤。
2. C语⾔项⽬编译运⾏的⽅式
在linux环境下,⼀般都是通过gcc和Makefile在命令⾏中进⾏编译。
在Windows下,我们也可以使⽤命令⾏来对项⽬进⾏编译,这和linux是⼀样的,只不过编程环境的搭建会⿇烦⼀点。现在⾮常流⾏的vscode其实也是利⽤gcc来进⾏编译的,只不过我们把编译器路径和编译命令放进了配置⽂件中。在Windows下,更多的是在IDE中进⾏C 语⾔项⽬编译,⽐如微软VisualStudio,DEV-C++。
下⾯在WIndows下分别演⽰⼀下这三种⽅法,⾸先我们来看⼀下这次演⽰的所有代码⽂件。
add.c
#include <stdio.h>
#include "add.h"
int add(int i,int j){
printf("do add\n");
return i+j;
}
add.h
#ifndef __ADD_H_
#define __ADD_H_
int add(int i,int j);
#endif
data.h
#ifndef __DATA_H_
#define __DATA_H_
int i=1;
int j=2;
#endif
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"makefile phony
#include "data.h"
extern int i;
extern int j;
int main(){
printf("i + j = %d\n",add(i,j)); printf("i - j = %d\n",sub(i,j)); return 0;
}
sub.c
#include <stdio.h>
#include "sub.h"
int sub(int a, int b) {
printf("do sub\n");
return a - b;
}
sub.h
#ifndef __SUB_H_
#define __SUB_H_
int sub(int a, int b);
#endif
可以看出上⾯这些代码⽂件都是⾮常简单的,但包括了基本的依赖关系,便于我们整体把握项⽬,⽽不拘泥于细节。
1. 在vscode中⽤命令⾏进⾏编译(gcc和Makefile)
如果不适⽤Makefile的话,在源⽂件不是很多的时候是可⾏的,在本例中,编译命令为:
gcc main.c add.c sub.c - //编译⽣成可执⾏⽂件
./ //运⾏⽣成的可执⾏⽂件
打印结果为:
do add
i + j = 3
do sub
i - j = -1
如果源代码⽂件⼀多的话,我们⼀般就需要通过Makefile来管理了,Makefile的写法我就不细说了,⼤家可以⽹上资料学习学习。⾸先本例中的makefile如下:
a : main.o add.o sub.o
gcc - main.o add.o sub.o
main.o : main.c add.h sub.h data.h
gcc -c main.c
add.o : add.c add.h data.h
gcc -c add.c
sub.o : sub.c sub.h data.h
gcc -c sub.c
在命令⾏中输⼊
make
命令⾏中会显⽰:
gcc -c main.c
gcc -c add.c
gcc -c sub.c
gcc -o a main.o add.o sub.o
在键⼊./a.exe
命令⾏中会显⽰如下结果,和上⾯是完全⼀样的。
do add
i + j = 3
do sub
i - j = -1
2. 在DEVC++中编译
直接新建项⽬
把⽂件全部添加进去
直接点击编译运⾏即可
看起来IDE编译运⾏只需要⼀个按钮,实际上IDE也是帮我们默默的维护⼀个Makefile,在该项⽬⽬录下就存在⼀个Makefile⽂件,打开其内容如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论