【问题标题】:How to compile C program with variable name using Linux terminal?如何使用 Linux 终端编译带有变量名的 C 程序?
【发布时间】:2020-06-24 06:24:17
【问题描述】:

有没有什么方法可以比运行整个命令更有效地编译 C 程序。

gcc -g -Wall file_name.c -o file_name.out

例如这样使用make命令:make argument.c

我想让make命令运行这个命令gcc -g -Wall argument.c -o argument_no_extension.out

我试图学习 vim 但要编译程序我必须写下整个命令或必须使用箭头键再次运行它。但是 vs-code task.json 有以下参数:

"gcc","-g", "${relativeFile}", "-o","${fileBasenameNoExtension}.out", "&&", "clear" , "&&" , "./${fileBasenameNoExtension}.out"

【问题讨论】:

  • 你要找的关键字肯定是makefile
  • 是的,我知道 makefile 用于运行 make 命令,但我不知道如何为此目的制作 makefile。
  • 通常,除了 C 编译器 a.out 的默认输出之外,程序在 Unix 系统上没有扩展。你不必输入ls.out 或类似的东西。您可以键入make file_name,它将从file_name.c 编译。您也可以设置编译选项。如果你真的坚持.out扩展,你可以写一个规则从.c文件创建一个.out文件。
  • 简而言之,您要求我删除 .out 扩展名,只需根据 file_name 命名可执行文件。

标签: c linux makefile


【解决方案1】:

您可以创建一个类似于以下内容的 Makefile:

CFLAGS := -Wall -Wextra -Wconversion -pedantic -std=gnu11 -ggdb

%.out : %$(parm).c
    $(CC)  $(CFLAGS) $^ -o $@

然后为特定的 *.c 文件运行 Makefile:

make -Dparm=<desired file name>

【讨论】:

    【解决方案2】:

    如 cmets 中所述,您已经可以做到

    make file_name
    

    如果有一个名为“file_name.c”的 C 源文件,它将使用默认构建规则(因此您甚至不需要 Makefile)构建一个名为“file_name”的可执行文件

    如果您确实需要具有 .out 扩展名的可执行文件,您可以创建一个如下所示的 Makefile

    CFLAGS=-g -Wall
    
    %.out: %.c
            $(CC) $(CFLAGS) -o $@ $^
    

    这定义了一个规则,对于以“.out”结尾的任何内容,它将从相应的“.c”文件构建它。所以如果你输入

    make file_name.out
    

    如果你有一个“file_name.c”,它将构建“file_name.out”

    【讨论】:

    • 先生,您能解释一下 $@ 和 $^ 吗,谢谢您的回答。正如其他评论中提到的,我认为 .out 扩展名对于制作可执行文件不是必需的。我还尝试了另一种方法,方法是制作一个 bash 脚本 "gcc -g -Wall $1.c -o $1 "。你能告诉我 make 相对于 bash 脚本的优势吗?
    • $@ 被替换为规则左侧的文件名 - 您正在构建的东西。 $^ 是右边的文件(依赖项)。
    • 至于为什么要使用make - 它是程序员使用了几十年的标准工具,与您的脚本不同,它知道何时需要构建某些东西。如果您尝试make something 两次,它只会编译一次“某事”,因为您的脚本将重新编译所有内容。当您将多个源文件和头文件编译成一个可执行文件时,您会发现它必不可少
    • %.out: %.c 是做什么的?
    • 答案中已经涵盖了
    【解决方案3】:

    只需创建一个Makefile,它应该包含您显示的命令

    gcc -g -Wall file_name.c -o file_name.out
    

    将此Makefile 放在源代码所在的目录中。 然后打开命令行,将目录切换到这个Makefile所在的位置。

    然后执行这个命令

    make
    

    不用给make argument.c

    【讨论】:

    • 但是当我需要编译不同名称的文件时出现问题,例如 fact.c 或 stackoverflow.c 然后每次我必须制作一个单独的 make 文件但我想制作一个通用的 make 文件接受文件名作为 make 命令的参数并执行 gcc 命令。
    • 为此,您必须创建一些脚本来运行 makefile。你能看看这个链接stackoverflow.com/questions/6273608/…
    • 嗯,这不是你的问题。
    • @MadScientist 抱歉,我无法很好地解释我的问题。先生,我检查了您的个人资料,您似乎是资深的 emacs 用户。目前我正在学习vim,我是否也应该尝试emacs。如果是,那为什么?
    • 我不确定 SO cmets 是否是讨论的最佳场所。 Emacs 与 vi 是程序员中最古老的争论之一……我无法用 500 个字符回答。 vi 很好学,至少足以应付,因为它安装在任何地方。如果你需要一个编辑器来进行实际工作,你应该试试 Emacs 看看。我发现这种偏好有点个人化。有些人喜欢模态编辑。有些没有。有些人喜欢一个运行数天/数周的带有大量缓冲区的编辑器,有些人喜欢停止/启动。 Emacs 有一些很棒的模式,如果你喜欢 vi 模态编辑,包括 Viper。
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多