【问题标题】:passing optional arguments to a makefile将可选参数传递给生成文件
【发布时间】:2022-01-09 16:36:04
【问题描述】:

我有一个程序,我有这个 make 文件,我试图用这个 makefile 运行我的程序,它编译得很好问题是当我运行程序时我要像这样运行它./user -n tejo.tecnico.ulisboa.pt -p 58011 和这个@987654323 @ 或者这个 -p 58011 是可选的。

我看到了这个帖子 Passing arguments to "make run",但我不明白我在 make run 命令中做错了什么

那么谁能告诉我我的 makefile 出了什么问题?

顺便说一句,我在制作 makefile 和使用命令行方面相当新。

程序:

# Makefile
CC   = g++
LD   = g++

AUXLIB = auxiliar_code/aux_functions.h
SOCKETLIB = socket_operations/socket_functs.h
COMMANDSLIB = commands/commands.h

.PHONY: all clean run

all: client

client: socket_operations/socket.o auxiliar_code/aux.o commands/commands.o commands/client.o main.o
    $(LD) -o user socket_operations/socket.o auxiliar_code/aux.o commands/commands.o commands/client.o main.o

auxiliar_code/aux.o: auxiliar_code/aux_functions.cpp $(AUXLIB) client_constants.h
    $(CC) -o auxiliar_code/aux.o -c auxiliar_code/aux_functions.cpp

commands/client.o: commands/Client.cpp $(COMMANDSLIB) $(SOCKETLIB) $(AUXLIB) client_constants.h
    $(CC) -o commands/client.o -c commands/Client.cpp

commands/commands.o: commands/commands.cpp $(COMMANDSLIB) $(SOCKETLIB) $(AUXLIB) client_constants.h
    $(CC) -o commands/commands.o -c commands/commands.cpp

socket_operations/socket.o: socket_operations/socket_functs.cpp $(SOCKETLIB) $(AUXLIB) client_constants.h
    $(CC) -o socket_operations/socket.o -c socket_operations/socket_functs.cpp

main.o: main.cpp $(COMMANDSLIB) $(AUXLIB) client_constants.h
    $(CC) $(CFLAGS) -o main.o -c main.cpp

clean:
    @echo Cleaning files generated
    rm -f auxiliar_code/*.o commands/*.o socket_operations/*.o *.o user

run: user
    @echo ./user $(filter-out $@,$(MAKECMDGOALS))
%:
    @:

【问题讨论】:

  • 你使用什么 make run 命令?你试过MAKECMDGOALS="-n tejo.tecnico.ulisboa.pt -p 58011" make run 吗?
  • 这是一种极其迟钝的传递参数的方式。只需执行 args := run: user ./user $(args),然后运行 ​​make run args='foo bar' 以使用 args 运行,或者只需 make run 以不使用 args 运行。
  • 你绝对不想在命令行或环境中设置MAKECMDGOALS:这是一个GNU make 变量。我同意没有办法回答这个问题,因为它不包含任何实际调用 make 的示例,也不包含收到的输出或错误。
  • 一般来说,我建议不要使用 make 目标来运行你的程序。 Make 旨在构建您的程序。也许如果您有一个要调用的特定测试用例并为该测试用例提供了一些硬编码选项,那么这是有道理的。但是为什么输入make run args="foo bar" 比输入./user foo bar 更好??

标签: c++ makefile


【解决方案1】:

你应该做的是声明一个变量(可能是默认的):

# Fill in your default here, setting from command line will override
USER_OPTIONS ?=

run: user
    ./user $(USER_OPTIONS)

然后从命令行调用 make 设置选项:

make run USER_OPTIONS="-n tejo.tecnico.ulisboa.pt -p 58011"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2014-09-12
    • 2017-08-26
    • 2015-04-28
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多