我最近开始使用gcc命令手动编译/链接我的C文件。但是,它需要在命令末尾键入所有源文件。当有许多文件要编译/链接时,它可能很无聊。 这就是为什么我想要为命令创建bash别名的原因,该命令会直接输入文件夹的所有* .h和* .c文件。
我在.bashrc中的行是这样的:
alias compile =' ls * .c * .h | gcc -o main'
我发现它有时会工作,但大部分时间编译都会返回:
gcc:致命错误:没有输入文件
编译终止。
我认为管道会将ls * .c * .h的结果作为gcc的参数,但它似乎不会那样工作。我究竟做错了什么?是否有更好的方法来实现同样的目标?
感谢您的帮助
答案 0 :(得分:6)
管道不会创建命令行参数。管道输入标准输入。
您需要xargs
将标准输入转换为命令行参数。
但您根本不需要(或想要)xargs
或ls
或标准输入。
如果您只想将每个.c
文件编译到可执行文件中,请使用:
gcc -o main *.c
(您在.h
命令行上通常不需要gcc
个文件。)
正如凯在评论中指出的那样,以上命令的迂回正确和更安全的版本是(并且我并不打算以贬义的方式):
gcc -o main ./*.c
请参阅Filenames and Pathnames in Shell: How to do it Correctly,了解各种问题的广泛讨论。
话虽如此,你可以使用任何一种工具来避免需要这样做,并且只需要在某些事情发生变化时重建所有内容。
像make
这样的工具或其众多克隆,"前端" (例如autotools,cmake)或替换(tup,scons,cons和大约一百万个其他工具)。
答案 1 :(得分:4)
您是否尝试使用makefile?听起来这可能对你正在尝试的事情更有效。
如果你真的想用BASH别名来做,你必须使用xargs来获得命令行参数的标准输入。
答案 2 :(得分:4)
这里有几个误解:
ls
的神奇之处,它是在命令行上执行扩展的shell; .c
个文件,而这些文件又可能包含标题。有了这些知识,你就会明白正确的命令就像
gcc -o main *.c
实际上我们可以做得更好:首先,您要将*.c
更改为./*.c
;这可以防止名称以-
开头的文件被解释为命令行选项。
最重要的是,你应该真正启用编译器警告,它们可以节省生命。您需要添加-Wall
和-Wextra
。
gcc -Wall -Wextra -o main ./*.c
最后,值得一提的是,默认情况下,您正在编译并禁用优化。如果你正在调试那么没问题,但是你还要添加-g
以使可执行程序在调试中可用;否则,如果目标是速度,则至少应添加-O2
。