【问题标题】:How to create Makefile to compile a single arbitrary filename in C如何创建 Makefile 以在 C 中编译单个任意文件名
【发布时间】:2017-08-26 02:22:52
【问题描述】:

我是 C 编程的新手,我想知道在 Makefile 中编写什么来编译单个 .c 文件。

假设我在一个文件夹中有多个.c 文件)即sample1.csample2.csample3.c 等),我只想编译一个特定的文件名。 我只想输入“make sample2”,它将编译并有一个名为sample2 的输出(几乎将保留.c 的名称)。

我已经阅读了几种解决方案,可能有人提出了这个建议,但没有奏效。

SRC =  $(shell find . -type f -name \*.c)

executable: $(SRC:.c=.o)
    gcc -std=gnu99  $@ $^ 

我需要做什么才能让它工作?

【问题讨论】:

  • 那个find命令是说从计算机上所有硬盘的根节点开始。这是因为它使用的是“非相对”路径 I.E. \*.c 将在根目录中找到每个 *.c 文件。建议将行更改为:SRC = $(shell find . -type f -name .\*.c) 但是,make 实用程序(用于 gnu)具有以下命令:SRC := $(wildcard *.c),它将在当前目录中找到所有“c”文件。
  • 如果是我,我会在编译时启用警告。 IE。至少使用:<tab>gcc -std=gnu99 -Wall -Wextra -pedantic -Wconversion $@ $^ -I. ... 然后是任何库路径,然后是代码所需的任何库。
  • 您不需要makefilemake sample2 将编译sample2.c 以创建程序sample2。如果需要,可以使用 /dev/null 作为名称:make -f /dev/null sample2。等等。当然,它使用默认选项进行编译。如果您想使用更严格的标志,那么您可以先使用echo 'CFLAGS = -Wall -Wextra -Werror -std=c11 -O3 -g' > makefile,然后再使用make sample2
  • @user3629249 回复“根目录中的每个文件”:我认为“*.c”不会按原样到达查找命令; ia POSIX shell 可能会删除参数中的反斜杠并保留文字“*”。细节取决于环境:在 POSIX 系统中,FS 根无论如何都是正斜杠,因此即使将 baskslash 传递给find,它也不会匹配任何内容。对于 MS Windows,它的参与度更高:Cygwin 不会将 Windows 路径转换为 ​​POSIX 程序(如find)的参数中的 POSIX 路径,但 MSYS(2) 可能。最后,-name 参数确实告诉 find 在哪里搜索。
  • @PeterA.Schneider,你说得对,我错了。我在想什么?

标签: c gcc makefile gnu-make


【解决方案1】:

将评论转化为答案。

您不需要makefilemake sample2 将编译 sample2.c 以创建程序 sample2

如果您愿意(或者如果您需要忽略现有的makefile),可以使用/dev/null 作为makefile 的名称:

make -f /dev/null sample2

当然,它使用默认选项进行编译。如果您想使用更严格的标志,那么您可以这样做(假设现有的makefile 是可消耗的):

echo 'CFLAGS = -Wall -Wextra -Werror -std=c11 -O3 -g' > makefile
make sample2

或该主题的一些变体,例如:

make -f /dev/null CFLAGS="-Wall -Wextra -Werror -std=c11 -O3 -g" sample2

简而言之,make 知道如何将单个 C 文件编译成对应名称(减去 .c 后缀)的可执行文件,而不需要任何显式的 makefile。如果需要,您可以调整它编译该文件的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多