jmake 编译当前目录所有c/c++单文件

时间:2021-11-20 12:46:08

在一个目录下写一些单文件的c或者c++文件时,每次敲出命令如g++ a.cpp -o a感觉比较麻烦。

所以就模仿makefile的功能,实现了扫描当前目录,并将所有c文件、cc文件、cpp文件直接调用gcc/g++编译。

本程序的缺点之一就是不能用于文件间有相互include的情况,因为要扫描代码include了其他什么文件比较麻烦。而且不能在编译命令中加入其他库的选项。

 

使用方式:

1 jmake

 

源代码:

 1 /*
2 * author: huanglianjing
3 *
4 * this is a program to compile all single c/c++ file of current directory
5 *
6 * usage: jmake
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <dirent.h>
13 #include <string.h>
14 #include <sys/stat.h>
15
16 int main()
17 {
18 struct dirent *entry;
19 struct stat statbuf;
20
21 DIR *dp = opendir(".");
22 while ((entry=readdir(dp)) != NULL) {
23 lstat(entry->d_name,&statbuf);
24 if (!S_ISDIR(statbuf.st_mode)) {
25 char fname[57], ename[57], instruction[207];
26 strcpy(fname,entry->d_name);
27 strcpy(ename,entry->d_name);
28 int len = strlen(fname);
29 if (len>=3 && fname[len-1]=='c' && fname[len-2]=='.') {//.c
30 ename[len-2] = '\0';
31 sprintf(instruction,"gcc %s -o %s",fname,ename);
32 printf("%s\n",instruction);
33 system(instruction);
34 }
35 else if (len>=4 && fname[len-1]=='c'
36 && fname[len-2]=='c' && fname[len-3]=='.') {//.cc
37 ename[len-3] = '\0';
38 sprintf(instruction,"g++ %s -o %s",fname,ename);
39 printf("%s\n",instruction);
40 system(instruction);
41 }
42 else if (len>=5 && fname[len-1]=='p' && fname[len-2]=='p'
43 && fname[len-3]=='c' && fname[len-4]=='.') {//.cpp
44 ename[len-4] = '\0';
45 sprintf(instruction,"g++ %s -o %s",fname,ename);
46 printf("%s\n",instruction);
47 system(instruction);
48 }
49 }
50 }
51 closedir(dp);
52 return 0;
53 }