• 一键编译+执行c语言小Demo


    方法一

    因为会经常写c的小demo所以也就用不上项目工程编译工具make那么导致我每次修改为代码就需要gcc demo.c -g -o demo 操作,然后就想着用shell进行自动化执行,然后雏型就出来了

    c

    #!/bin/bash
    
    path=`pwd`
    source_file=`ls ${path}/*.c`
    gcc $source_file -o ${source_file%.*} -g
    ${source_file%.*}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    编写如上内容,然后命名为c再放入到/usr/local/bin目录下并给它可执行权限chmod +x c,就可以在任意目录执行了

    这里就是简单的获取需要执行编译脚本的路径,然后进行一个编译+运行操作

    $ ls;cat demo.c                                                 [~/tmp]
    demo.c
    #include
    
    int main(){
       printf("hi\n");
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后执行c那么就可以直接看到结果了

    $ c                                                             [~/tmp]
    hi
    $ ls                                                            [~/tmp]
    demo*      demo.c     demo.dSYM/
    
    • 1
    • 2
    • 3
    • 4

    很显然这只是一个简单的功能实现雏型,为了将它工具化就需要对不同的使用场景和使用功能考虑,上述的问题有:

    1. 当源代码的路径时存在一个目录和源代码同名字时
    2. 当源代码的路径存在多个.c文件时
    3. 当源代码是c++
    4. 当编译需要多个参数时

    然后完善上面的问题后的脚本为

    #!/bin/bash
    path=`pwd`
    build_type="$1"
    
    if [ "$build_type" == "++" ];then
    	c="g++";	file=`ls ${path}/*.cpp`;	shift
    else
    	c="gcc";	file=`ls ${path}/*.c` ;fi
    
    main(){
    	find_source_file
    	build $*
    }
    
    find_source_file(){
    	source_file=$(echo $file | awk '{print $1}')
    	multi_file=$(echo $file | awk '{print $2}')
    	if [ -z "$source_file" ];then	echo -e "\033[31mCouldn't find format $c source file\033[0m";exit ;fi
    	if [ ! -z "$multi_file" ];then	echo -e "\033[31mMultiple files checked~\033[0m";	echo -e "\033[31mThe $source_file file will be used\033[0m" ;fi
    }
    
    build(){
    	$c $source_file -o ${source_file%.*} -g $*
    	${source_file%.*}
    }
    
    main $*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    那么就来玩玩。c\cpp源代码如下:

    $ cat demo.c demo.cpp                                                                                                               [/t/d/demo]
    #include
    
    int main(){
    
       printf("c\n");
       return 0;
    }
    #include
    
    int main(){
    
       printf("cpp!\n");
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试

    $ ls                                                                                                                                [/t/d/demo]
    demo.c     demo.cpp   demo.dSYM/
    $ c                                                                                                                                 [/t/d/demo]
    c
    $ c ++                                                                                                                              [/t/d/demo]
    cpp!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当前目录存在多个源代码时

    $ ls                                                                                                                                [/t/d/demo]
    demo*       demo.c      demo.cpp    demo.dSYM/  democc.c    democc.cpp
    $ c                                                                                                                                 [/t/d/demo]
    Multiple files checked~
    The /tmp/demo/demo/demo.c file will be used
    c
    $ c ++                                                                                                                              [/t/d/demo]
    Multiple files checked~
    The /tmp/demo/demo/demo.cpp file will be used
    cpp!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    为了方便大家搭建使用,可以执行下面代码一键搭建完成

    echo "IyEvYmluL2Jhc2gKcGF0aD1gcHdkYApidWlsZF90eXBlPSIkMSIKCmlmIFsgIiRidWlsZF90eXBlIiA9PSAiKysiIF07dGhlbgoJYz0iZysrIjsJZmlsZT1gbHMgJHtwYXRofS8qLmNwcGA7CXNoaWZ0CmVsc2UKCWM9ImdjYyI7CWZpbGU9YGxzICR7cGF0aH0vKi5jYCA7ZmkKCm1haW4oKXsKCWZpbmRfc291cmNlX2ZpbGUKCWJ1aWxkICQqCn0KCmZpbmRfc291cmNlX2ZpbGUoKXsKCXNvdXJjZV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQxfScpCgltdWx0aV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQyfScpCglpZiBbIC16ICIkc291cmNlX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbUNvdWxkbid0IGZpbmQgZm9ybWF0ICRjIHNvdXJjZSBmaWxlXDAzM1swbSI7ZXhpdCA7ZmkKCWlmIFsgISAteiAiJG11bHRpX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbU11bHRpcGxlIGZpbGVzIGNoZWNrZWR+XDAzM1swbSI7CWVjaG8gLWUgIlwwMzNbMzFtVGhlICRzb3VyY2VfZmlsZSBmaWxlIHdpbGwgYmUgdXNlZFwwMzNbMG0iIDtmaQp9CgpidWlsZCgpewoJJGMgJHNvdXJjZV9maWxlIC1vICR7c291cmNlX2ZpbGUlLip9IC1nICQqCgkke3NvdXJjZV9maWxlJS4qfQp9CgptYWluICQqCg==" | base64 -d > /usr/local/bin/c && chmod a+x /usr/local/bin/c
    
    • 1

    方法二

    后来我看到了这篇文章https://zhuanlan.zhihu.com/p/143231248 这种设计就是运用了我上面所说的没有指定Shebang字符头那么就会默认交给sh解释器执行,作者说了其实就是在c源代码里面执行shell语法进行编译自身,但同时不能被c编译器给发现错误

    这里发现作者的代码有点小错误,只需要把"./$proName" 改成-> “$proName就可以了”

    简单改写如下:demo.c

    #if 0
    pro=${0%.*} && gcc $0 -o $pro $@ && $pro && exit
    #endif
    
    #include
    
    int main(){
       printf("c\n");
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    首先你必须给demo.c执行权限然后直接执行./demo.c,因为没有指定Shebang字符头所以会默认将demp.c交给sh解释器执行语句,当sh解释器遇到#时会将它视为单行注释,然后会正常的执行编码命令。直到exit后退出执行

    而因为#if #endifc编译器里面也是一个合法的注视命令,所以c编译器会过滤掉文件头部一块,从而编译成功

    这种方法也不错,但是需要每次都添加上述的一个头部shell代码,如果你是一个vim用户那么你可以直接在init.vim中添加上述的头部shell代码到你的c\c++模版中

    	 if &filetype == 'cpp'
              call setline(1, "#if 0")
              call setline(2, "pro=${0%.*} && gcc $0 -o $pro $@ && $pro && exit")
              call setline(3, "#endif")
              call setline(4, "")
              call setline(5, "#include")
              call setline(6, "")
              call setline(7, "int main(){")
              call setline(8, "")
              call setline(9, "   printf(\"\\n\");")
              call setline(10, "   return 0;")
              call setline(11, "}")
          endif
          if &filetype == 'c'
        	...
          endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    方法三

    可以在vim里面添加一个函数,也就是一键执行编译,这里网上一把大就不说了

    方法四

    还有一种就是使用tcc,我不想额外的搭建环境,所以大家自行探索

  • 相关阅读:
    Python数据挖掘实用案例——自动售货机销售数据分析与应用
    某电商网站的数据库设计(4)——创建各个基础表之间的关联视图
    数据结构与算法之美10(排序)
    Nginx配置实例-负载均衡
    Spring MVC中通过配置文件配置定时任务
    如何使用wireShark的追踪流功能抓取并还原文件
    225页10万字政务大数据能力平台项目建议书
    Docker创建FTP服务器
    elasticsearch 之 histogram 直方图聚合
    Springboot-redis学习第一天
  • 原文地址:https://blog.csdn.net/csdn546229768/article/details/128058903