用于编译和链接所有C文件的别名或命令

时间:2015-11-09 18:55:34

标签: c linux bash gcc

我最近开始使用gcc命令手动编译/链接我的C文件。但是,它需要在命令末尾键入所有源文件。当有许多文件要编译/链接时,它可能很无聊。 这就是为什么我想要为命令创建bash别名的原因,该命令会直接输入文件夹的所有* .h和* .c文件。

我在.bashrc中的行是这样的:

  

alias compile =' ls * .c * .h | gcc -o main'

我发现它有时会工作,但大部分时间编译都会返回:

  

gcc:致命错误:没有输入文件

     

编译终止。

我认为管道会将ls * .c * .h的结果作为gcc的参数,但它似乎不会那样工作。我究竟做错了什么?是否有更好的方法来实现同样的目标?

感谢您的帮助

3 个答案:

答案 0 :(得分:6)

管道不会创建命令行参数。管道输入标准输入。

您需要xargs将标准输入转换为命令行参数。

但您根本不需要(或想要)xargsls或标准输入。

如果您只想将每个.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)

这里有几个误解:

  • 管道将第一个命令的标准输出重定向到第二个命令的标准输入;但是,gcc不接受要在stdin上编译的文件,而是在命令行上;
  • 通配符语法不仅仅是ls的神奇之处,它是在命令行上执行扩展的shell;
  • 头文件要编译 - 您编译.c个文件,而这些文件又可能包含标题。

有了这些知识,你就会明白正确的命令就像

gcc -o main *.c

实际上我们可以做得更好:首先,您要将*.c更改为./*.c;这可以防止名称以-开头的文件被解释为命令行选项。

最重要的是,你应该真正启用编译器警告,它们可以节省生命。您需要添加-Wall-Wextra

gcc -Wall -Wextra -o main ./*.c

最后,值得一提的是,默认情况下,您正在编译并禁用优化。如果你正在调试那么没问题,但是你还要添加-g以使可执行程序在调试中可用;否则,如果目标是速度,则至少应添加-O2