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

Vin*_*ier 5 c linux bash gcc

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

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

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

我发现它工作了一段时间,但大多数时候编译将返回这个:

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

编译终止.

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

谢谢你的帮助

Eta*_*ner 6

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

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

但你并不需要(或希望)xargsls或在此标准输入的.

如果您只想将每个.c文件编译到可执行文件中,那么只需使用:

gcc -o main *.c
Run Code Online (Sandbox Code Playgroud)

(通常不需要命令行.h上的文件gcc.)

正如Kay在评论中指出的那样,上述命令的迂腐正确和更安全的版本是(我不打算以贬义的方式):

gcc -o main ./*.c
Run Code Online (Sandbox Code Playgroud)

请参阅Shell中的文件名和路径名:如何正确执行此操作以在此处对各种问题进行广泛讨论.

话虽这么说,你可以使用任何一种工具来避免需要这样做,并且只需要在一些事情发生变化时就需要重建所有东西.

工具喜欢make或其许多克隆,"前端"(例如autotools,cmake)或替代品(tup,scons,cons和大约一百万个其他工具).

  • 永远不要使用`*.foo`,而是使用`./*.foo`. (2认同)
  • @Kay虽然这是一种迂腐的态度,即使我没有被说服也是值得的.面对各种"糟糕"的文件名,无论如何,更加正确和安全,但在任何不打算随意输入的一般用法的情况下,我从未确信成本值得再培训. (2认同)