【发布时间】: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更好??