【问题标题】:Makefile does not work properly for C programMakefile 不适用于 C 程序
【发布时间】:2017-03-02 17:41:21
【问题描述】:

我已经使用以下结构完成了这个 Makefile:

BIN_FILES = array cliente servidor

CC = gcc


CCGLAGS =   -Wall -g


all: CFLAGS=$(CCGLAGS)
 all: $(BIN_FILES)
.PHONY : all

array.o: array.c array.h
    $(CC) -c -Wall -fPIC array.c

cliente.o: cliente.c array.h
    $(CC) -Wall -c cliente.c

cliente: cliente.o array.h
    $(CC) -Wall -o cliente -ldl -lrt

servidor.o: servidor.c mensajes.h
    $(CC) -Wall -c servidor.c -lrt -lpthread

servidor: servidor.o
    $(CC) -o $@ servidor -lrt -lpthread

clean:
    rm -f $(BIN_FILES) *.o

.SUFFIXES:
.PHONY : clean

但是当我尝试执行它时,它只适用于第一条规则。然后执行停止。我的最终目标是让每条规则都起作用,因为如果我分别执行每条规则,它就会起作用:

gcc -c -Wall -fPIC array.c
gcc -fPIC -shared -o libarray.so array.o -lrt
gcc -Wall -o cliente cliente.c -ldl -lrt
gcc -Wall -o servidor servidor.c -lrt -lpthread

谢谢

编辑: 现在我在应用@Jens 修改时收到以下错误:

make: *** No rule to make the objective 'array', necesary for 'all'. Stop.

【问题讨论】:

  • 开始修复语法错误。
  • 编辑错误,抱歉

标签: gcc makefile compiler-errors shared-libraries


【解决方案1】:

cliente.o 和 servidor.o 的目标应该使用-c 而不是-o,即您要编译为目标文件。

将头文件指定为目标客户端和服务端中的依赖项也没有任何意义。这些命令只链接,不编译文件。

servidor: servidor.o
    $(CC) -o $@ servidor.o -lrt -lpthread

在使用-c 编译成目标文件时,指定库选项-ldl 等也没有意义。

cliente.o: cliente.c array.h
    $(CC) -Wall -c cliente.c

【讨论】:

  • 我想我不理解最后两个更正。您能否添加一个示例来说明您的建议?
  • @giorgioW 添加了示例。顺便说一句,你所做的几乎可以用一个小得多的 Makefile 来完成,使用 make 的内置规则。你正在重新发明轮子。
  • 是的,我知道这不是制作 Makefile 的最佳方式,但我是从这个领域开始的,所以首先我要创建基本的 Makefile
  • 现在我在应用您的修改时收到以下错误:make: *** No rule to make the objective 'array', necesary for 'all'. Stop.
  • @giorgioW 那是因为没有目标 array: array.o 类似于您为 servidor 和 cliente 设置的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2014-03-13
  • 2012-04-13
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多