基础版本的jmake是将所有当前文件夹下的C/C++文件生成单文件编译命令,并且jmake命令不可加选项。

现在做的改进是能在输入命令jmake时加上一些选项了,‘-’开头的选项加入到每个编译单文件的生成命令中去,其他的选项则是指定要编译的源文件。当然,如果没有指定源文件,就把所有.c,.cc,.cpp文件都分别编译。

代码如下:

/*
 * author: huanglianjing
 *
 * this is a program to compile all single c/c++ file of current directory
 *
 * usage: jmake <files> <-options>
 * if no files assigned, all files in directory will be searched
 * any option will be added to every instruction
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

][], option[][];
int filenum, optionnum;

];

int file_in_argv(char *filename)//whether filename in argv
{
    int i;
    ; i<filenum; ++i) {
        ) ;
    }
    ;
}

void suffix(char *filename)//get filetype, return empty string if not has
{
    int len = strlen(filename);
    int pos;
    ; pos>=; --pos) {
        if (filename[pos] == '.') break;
    }
     || pos == len-) suf[] = ;
    else {
        int i;
        ; i<len--pos; ++i) suf[i] = filename[pos++i];
        suf[len--pos] = ;
    }
}

int main(int argc, char *argv[])
{
    struct dirent *entry;
    struct stat statbuf;

    int i;
    filenum = optionnum = ;
    ; i<argc; ++i) {
        ] == '-') {//option
            strcpy(option[optionnum++],argv[i]);
        }
        else {//file
            strcpy(file[filenum++],argv[i]);
        }
    }

    DIR *dp = opendir(".");
    ;
    while ((entry=readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if (!S_ISDIR(statbuf.st_mode)) {
            ], ename[], instruction[];
            strcpy(fname,entry->d_name);
            strcpy(ename,entry->d_name);
             || file_in_argv(fname)) ;//consider this file
            else continue;//not consider this file
            int len = strlen(fname);
            suffix(fname);
            ) {//.c
                ename[len-] = '\0';
                sprintf(instruction,"gcc %s -o %s",fname,ename);
                ; i<optionnum; ++i) {
                    strcat(instruction," ");
                    strcat(instruction,option[i]);
                }
                ++insnum;
                printf("%s\n",instruction);
                system(instruction);
            }
            ) {//.cc
                ename[len-] = '\0';
                sprintf(instruction,"g++ %s -o %s",fname,ename);
                ; i<optionnum; ++i) {
                    strcat(instruction," ");
                    strcat(instruction,option[i]);
                }
                ++insnum;
                printf("%s\n",instruction);
                system(instruction);
            }
            ) {//.cpp
                ename[len-] = '\0';
                sprintf(instruction,"g++ %s -o %s",fname,ename);
                ; i<optionnum; ++i) {
                    strcat(instruction," ");
                    strcat(instruction,option[i]);
                }
                ++insnum;
                printf("%s\n",instruction);
                system(instruction);
            }
        }
    }
    ) puts("no file compiled");

    closedir(dp);
    exit();
}

jmake 编译当前目录c/c++单文件 指定文件 可加选项的更多相关文章

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

    在一个目录下写一些单文件的c或者c++文件时,每次敲出命令如g++ a.cpp -o a感觉比较麻烦. 所以就模仿makefile的功能,实现了扫描当前目录,并将所有c文件.cc文件.cpp文件直接调 ...

  2. Nginx下载文件指定文件名称

    配置 location ^~/TEMP/ { alias/share/files/; if ($request_uri ~* ^.*\/(.*)\.(txt|doc|pdf|rar|gz|zip|do ...

  3. scala 读取文件加下的指定文件

    1,获取指定类型文件 def getFile(file:File): Array[File] ={ val files = file.listFiles().filter(! _.isDirector ...

  4. python实现在目录中查找指定文件的方法

    python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...

  5. dos 下删除文件、文件夹

    删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...

  6. php清理当前目录下的指定文件和空目录(源码),建议服务器端执行

    <?php /** * @desc 解析当前目录并递归删除目录下的指定文件 * @author mengdj<mengdj@outlook.com> 2014.10.02 1530 ...

  7. 如何解决Visual Studio2010 编译时提示系统找不到指定文件问题

    前一段时间,开始使用vs2010编写程序,可是在编译的时候总是报错,提示系统找不到指定文件,导致无法正常运行程序,花了好久时间终于找到原因解决,是因为常规的输出目录 要与链接的常规的输出文件要相对应. ...

  8. [问题解决]gradle编译失败系统找不到指定的文件

    [问题解决]gradle编译失败系统找不到指定的文件 问题描述 Error:C:\Users\diql.gradle\caches\2.14.1\scripts-remapped\settings_9 ...

  9. bat 读取当前目录指定文件信息并拼接

    bat 读取指定文件的信息并拼接成指定格式

随机推荐

  1. 用记事本编写C#程序并运行C#代码

    net framework自带有C#编译器 csc.exe,用它就好了 它在.NET框架目录下的<\Microsoft.NET\Framework\v**** (*号内容与版本有关) 不行你直接 ...

  2. JS delete 用法(删除对象属性及变量)

    1,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete ...

  3. C语言学习笔记frist---输入两个数比较大小

    C#学习中,问道艰辛,今自C学起,第一个函数学习:输入两个数比较大小,仅作练习: #include "stdafx.h" #include<stdio.h> // 包含 ...

  4. 【测试技术】ant中的for循环用法

    有的时候,我们希望ant中也能类似脚本语言一样进行for循环,以实现一些重复性工作.由于ant核心包并未提供此功能,所以需要下载一个扩展包扔到ant的lib目录下去.详细步骤如下: 1.下载核心包:a ...

  5. C# 线程池异步调用

    许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生.其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态.为了简化对这些线程的管理,. ...

  6. 【关于360极速浏览器的xx极速模式自动切换到兼容模式】

    原理上是可以的. 1  360基于Chromium 开源浏览器内核,它本身就是一个壳子.. 2  7.0之后的极速浏览器,不支持 它官方的那个声明标记.<meta name=”renderer” ...

  7. 甲骨文推动Java进军“物联网”

    该公司希望在嵌入式设备开发项目上Java可以取代C     随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...

  8. CentOS6.5与XP双系统安装

    因为工作的须要,须要安装一个XP系统和一个CentOS系统.依照在网上找到的一些方法尝试了下,结果都不是非常理想.最后,经过尝试和寻找,找到了一个比較方便的方法. 一.分区 本人的电脑硬盘是500G, ...

  9. (转)flash的Socket通讯沙箱和安全策略问题

    一.沙箱和安全策略问题 1.此问题发生在连接时,准确地说是连接前,分别两种情况: 1.本地播放 本地播放时,默认情况下Flash Player将不允许swf访问任何网络. 访问http://www.m ...

  10. iOS 键盘挡住UITextField

    iOS经常使用的两个功能:点击屏幕和return隐藏虚拟键盘和解决虚拟键盘挡住UITextField的方法 iOS上面对键盘的处理非常不人性化,所以这些功能都须要自己来实现,  首先是点击return ...