【问题标题】:The compile file doesn´t seem to be working编译文件似乎不起作用
【发布时间】:2021-02-03 03:44:54
【问题描述】:

我想问一下以下 Makefile 是否正确编写,因为程序似乎无法正确编译,但我不确定是 makefile 还是代码有问题:

CC = /usr/bin/gcc
CFLAGS = -g -Wall -Wextra -Werror -pthread 
DEPS = config.h shmHandling.h gameboard.h thinker.h strTools.h performConnection.h main.h
OBJ = main.o config.o shmHandling.o gameboard.o thinker.o strTools.o performConnection.o

# Link all .o files to program
%.o: %.c $(DEPS)
    @echo "-----------------------"
    @echo "Linking object files"
    $(CC) -o -c $@ $< $(CFLAGS)

sysprak-client: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)

# Compile everything and run it with CL params
.PHONY: play
play: sysprak-client
    @echo "-----------------------"
    @echo "Launching sysprak-client with GameID: $(GAME_ID)"
    ./sysprak-client -g $(GAME_ID) -p $(PLAYER)


.PHONY: clean
clean:
    -rm *.o $(OBJ) 

谢谢!

【问题讨论】:

  • 运行make时屏幕上显示什么?
  • 我得到了很多错误,但代码似乎在另一台没有 make 文件的计算机上运行 % make /usr/bin/gcc -g -Wall -Wextra -Werror -pthread -c - o gameboard.o gameboard.c gameboard.c: In function 'isEmpty': gameboard.c:7:8: error: 'DEBUGL' undeclared (first use in this
  • 每个错误都与游戏板文件相关联
  • 你在哪里声明DEBUGL
  • 如果你运行 make,所有的命令都会被打印出来。您可以手动检查并尝试这些命令中的每一个,以找出错误所在。

标签: c makefile gnu-make


【解决方案1】:

这个食谱:

$(CC) -o -c $@ $< $(CFLAGS)

应该是:

$(CC) -o $@ -c $< $(CFLAGS)

-o 选项后面必须跟输出文件名,$@ 完全按照目标对象文件的名称展开。所以-o $@ 是正确的,而-o -c 不是。

注意:它所属的规则之前的注释是错误的。该规则将 C 源文件编译为目标文件。 将所有 .o 文件链接到程序是以下规则。与echo 命令相同。您可能应该将所有这些重写为:

# Compile each .c to .o
%.o: %.c $(DEPS)
    @echo "-----------------------"
    @echo "Compiling $<"
    $(CC) -o $@ -c $< $(CFLAGS)

# Link all .o files to program
sysprak-client: $(OBJ)
    @echo "Linking object files"
    $(CC) -o $@ $^ $(CFLAGS)

# Run with CL params
.PHONY: play
play: sysprak-client
    @echo "-----------------------"
    @echo "Launching sysprak-client with GameID: $(GAME_ID)"
    ./sysprak-client -g $(GAME_ID) -p $(PLAYER)

【讨论】:

  • 首先感谢您的意见。我用了你告诉我的,但我仍然得到同样的错误。我只是查看了目录,并将所有头文件作为可执行文件(例如:thinker.h.gch 或 performconnection.h.gch)。那是问题吗?因为我认为头文件不应该成为可执行文件
  • @computersciencegermany .h.gch 文件是预编译的头文件。如果您有相应的头文件 (.h),只需删除 .h.gch 文件。如果不是,那么您就有麻烦了,因为预编译版本可能有问题,您对此无能为力。问题可能是您的 .c 源文件之一试图包含多个,或者您使用的编译选项与用于预编译的编译选项不同,或者其他...
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
相关资源
最近更新 更多