因为会经常写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%.*}
编写如上内容,然后命名为c
再放入到/usr/local/bin
目录下并给它可执行权限chmod +x c
,就可以在任意目录执行了
这里就是简单的获取需要执行编译脚本的路径,然后进行一个编译+运行操作
$ ls;cat demo.c [~/tmp]
demo.c
#includeint main(){printf("hi\n");
return 0;
}
然后执行c
那么就可以直接看到结果了
$ c [~/tmp]
hi
$ ls [~/tmp]
demo* demo.c demo.dSYM/
很显然这只是一个简单的功能实现雏型,为了将它工具化就需要对不同的使用场景和使用功能考虑,上述的问题有:
.c
文件时c++
时然后完善上面的问题后的脚本为
#!/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 $*
那么就来玩玩。c\cpp
源代码如下:
$ cat demo.c demo.cpp [/t/d/demo]
#includeint main(){printf("c\n");
return 0;
}
#includeint main(){printf("cpp!\n");
return 0;
}
测试
$ ls [/t/d/demo]
demo.c demo.cpp demo.dSYM/
$ c [/t/d/demo]
c
$ c ++ [/t/d/demo]
cpp!
当前目录存在多个源代码时
$ 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!
为了方便大家搭建使用,可以执行下面代码一键搭建完成
echo "IyEvYmluL2Jhc2gKcGF0aD1gcHdkYApidWlsZF90eXBlPSIkMSIKCmlmIFsgIiRidWlsZF90eXBlIiA9PSAiKysiIF07dGhlbgoJYz0iZysrIjsJZmlsZT1gbHMgJHtwYXRofS8qLmNwcGA7CXNoaWZ0CmVsc2UKCWM9ImdjYyI7CWZpbGU9YGxzICR7cGF0aH0vKi5jYCA7ZmkKCm1haW4oKXsKCWZpbmRfc291cmNlX2ZpbGUKCWJ1aWxkICQqCn0KCmZpbmRfc291cmNlX2ZpbGUoKXsKCXNvdXJjZV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQxfScpCgltdWx0aV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQyfScpCglpZiBbIC16ICIkc291cmNlX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbUNvdWxkbid0IGZpbmQgZm9ybWF0ICRjIHNvdXJjZSBmaWxlXDAzM1swbSI7ZXhpdCA7ZmkKCWlmIFsgISAteiAiJG11bHRpX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbU11bHRpcGxlIGZpbGVzIGNoZWNrZWR+XDAzM1swbSI7CWVjaG8gLWUgIlwwMzNbMzFtVGhlICRzb3VyY2VfZmlsZSBmaWxlIHdpbGwgYmUgdXNlZFwwMzNbMG0iIDtmaQp9CgpidWlsZCgpewoJJGMgJHNvdXJjZV9maWxlIC1vICR7c291cmNlX2ZpbGUlLip9IC1nICQqCgkke3NvdXJjZV9maWxlJS4qfQp9CgptYWluICQqCg==" | base64 -d >/usr/local/bin/c && chmod a+x /usr/local/bin/c
方法二后来我看到了这篇文章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
#includeint main(){printf("c\n");
return 0;
}
首先你必须给demo.c
执行权限然后直接执行./demo.c
,因为没有指定Shebang
字符头所以会默认将demp.c
交给sh
解释器执行语句,当sh
解释器遇到#时会将它视为单行注释,然后会正常的执行编码命令。直到exit
后退出执行
而因为#if #endif
在c编译器里面也是一个合法的注视命令,所以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
方法三可以在vim里面添加一个函数,也就是一键执行编译,这里网上一把大就不说了
方法四还有一种就是使用tcc
,我不想额外的搭建环境,所以大家自行探索
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧