【问题标题】:Command-line arguments via Makefile通过 Makefile 的命令行参数
【发布时间】:2014-04-21 21:38:01
【问题描述】:

我正在为我的一个程序设计一个生成文件,该程序运行一个简单的文本编辑程序并接收一个文件作为命令行参数。不过,我遇到的问题是,当我尝试在 makefile 中传递命令行参数时,编译器要么似乎不承认该文件,要么给出某种错误以指示链接出错。我的 makefile 源代码如下所示:

1 all:  basic.c
2   gcc -o basic2 basic2.c data
3 write:  basic2.o
4   gcc -o basic2 basic2.o
5 basic2.o: basic2.c
6   gcc basic2.c data

以及结果输出:

Must name an input file

如果 basic2.c 在没有参数(例如数据)的情况下运行,程序应该打印出这些内容。我应该将参数移动到不同的行,还是有更好的方法来写出这段代码?

另外,作为参考,basic2.c 使用以下代码:

    main(int argc, char *argv[])
7 {
8   if(argc > 2)  {
9     printf("Too many file names\n");
10     exit(0);
11   }
12   if(argc != 2) {
13     printf("Must name a file\n");
14     exit(0);
15   }

我是否引用了错误的 argv 索引?

【问题讨论】:

  • Makefile 用于编译程序,它不会运行它们。
  • Makefiles 可以用于运行程序,但是你当前的 Makefile 只是在编译。
  • 是的,基本问题是您混淆了编译和运行。编译时不向程序提供选项。

标签: c compilation linker makefile


【解决方案1】:

您似乎正试图在第三个 make 块中运行 basic2。如果您的意图是让第一个 make 目标同时编译和运行,您可能打算这样做:

# All depends on write, which depends on basic2, which depends on basic2.c
all:  write

# Command to run
write:  basic2
   ./basic2 data

# Command to compile
basic2: basic2.c
   gcc -o basic2 basic2.o

然后,使用命令make 将构建basic2(如果它已更改),然后运行代码。

make write 命令的作用与make 相同。

make basic2 命令将在必要时编译。

当然,all: write在这种情况下不是必须的,但是如果你有其他的东西想要一起构建,在write之后添加更多的依赖项会很有用。

【讨论】:

  • 是的,我终于弄明白了这是怎么回事——程序现在可以正常工作了,谢谢你指出我做错了什么。非常感谢。
【解决方案2】:

类似这样的:

runit: basic2
    ./basic2 data

basic2: basic.o
    gcc -o basic2 basic2.o

basic2.o: basic2.c
    gcc -c basic2.c

然后你可以使用make runit 编译程序,然后使用data 参数运行它。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2015-07-08
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多