C 根据命令行输入获取makefile以编译不同的程序

C 根据命令行输入获取makefile以编译不同的程序,c,linux,unix,makefile,C,Linux,Unix,Makefile,我对makefiles很陌生,所以如果这是一个有点愚蠢的问题,请原谅我。我正试图让我的makefile编译一个带有稍微不同文件的程序,这取决于在使用“make”时是否指定了输入。使用linux 基本上,当用户输入“makestrchecker”时,我希望它编译一个与用户输入“makeindex”时不同的程序 这就是我目前的情况(但它一直说它自己被覆盖了): 我只是想知道这样做的正确方法是什么您可以在makefile中给出任何目标的名称,make将尝试构建它。如果您没有给出任何目标名称,make将

我对makefiles很陌生,所以如果这是一个有点愚蠢的问题,请原谅我。我正试图让我的makefile编译一个带有稍微不同文件的程序,这取决于在使用“make”时是否指定了输入。使用linux

基本上,当用户输入“makestrchecker”时,我希望它编译一个与用户输入“makeindex”时不同的程序

这就是我目前的情况(但它一直说它自己被覆盖了):


我只是想知道这样做的正确方法是什么

您可以在makefile中给出任何目标的名称,make将尝试构建它。如果您没有给出任何目标名称,make将尝试在makefile中构建第一个目标(当然还有它的任何先决条件),然后停止

还请记住,与所有思维正确的软件一样:),make是区分大小写的,因此
STRCHECKER
STRCHECKER
是不同的目标

因此,您可以使用makefile运行
make strchecker.exe
,它将构建目标
strchecker.exe

另外,您没有说明构建的是什么平台,但请注意,对于像GNU/Linux或MacOS这样的POSIX风格的平台,在可执行文件中添加
.exe
这样的后缀并不常见。因此,如果您在这样的平台上,您可以只制作目标
strchecker
,而不是
strchecker.exe

如果您想继续使用
strchecker.exe
,并且仍然能够在不使用
.exe
后缀的情况下运行
make strchecker
,您可以将其添加到makefile中:

strchecker: strchecker.exe

因此,当您构建
strchecker
目标时,它将构建其所有先决条件(即
strchecker.exe
)。

您是否考虑过对从不同来源生成的可执行文件使用不同的名称?或者至少把它们放在不同的目录中?事实上,您在使用
make
时遇到的困难预示着在尝试使用该程序时可能会出现混淆。@JohnBollinger谢谢john我更改了它,以便该可执行文件有一个不同的名称,我只是想知道,当您运行make命令时,如何使其生成一个或另一个,因为此时我的makefile只是尝试生成两个。如果确实
make
根据同一目标名称的两个不同规则构建了两次可执行文件,那么很可能是因为您有两个不同的规则和配方,对于相同的目标名称(
stringchecker.exe
)。这是不允许的,我希望修复它可以解决任何正在发生的多层建筑问题。但当我运行“生成索引”时,它不应该只编译索引下的所有内容,而不是strchecker。谢谢你的帮助。我编辑了我的文件,所以没有.exe,但当我运行它时,它仍然会显示“makefile警告:覆盖目标'main.o'的recipie”“警告忽略目标main.o的旧配方”,然后它会显示“make:索引无需执行任何操作好了,您有一个目标
索引:
,它没有依赖项,也没有关于如何构建它的规则。所以,当你要求建造它时,make没有任何作用。您似乎在想,通过将
索引:
放在那里,您正在创建一个生成文件的某个小节,这样之后的所有规则都是该小节的一部分,然后您可以在每个小节中定义相同的目标,并使用
生成索引
来选择该小节。make不是这样工作的。makefile中定义的所有目标都添加到单个有向图(可能有多个根)。您已经定义了两种不同的方法来构建
main.o
。您只能有一个配方来构建给定的目标,因此make将第一个配方替换为第二个配方,并打印一条关于该配方的警告。如果您需要以两种不同的方式编译
main.c
(实际上您似乎没有这样做),那么您需要创建两个具有不同名称的不同输出文件。如果您不需要以不同的方式编译
main.c
,那么您只需要一条规则,而不是两条。
strchecker: strchecker.exe