1

我实际上是在尝试用 C 制作一个 makefile,但似乎将所有文件链接在一起时遇到了一些严重的问题。基本上,我正在尝试制作一个通过带有套接字的服务器运行的字典。我初始化字典并解释文件 servidor-dict.c 中的请求,然后从 dict.c 发送请求。我也有这两个文件:libjsocket.o,其中包含使用套接字的基本功能(j_socket()、j_bind()...)。jsocket.h 是 libjsocket.o 的头文件。

当我运行我的 makefile 时,控制台一直在说我:

Undefined symbols for architecture x86_64:
  "_j_socket", referenced from:
      _main in servidor-dict.o
  "_j_bind", referenced from:
      _main in servidor-dict.o
  "_j_accept", referenced from:
      _main in servidor-dict.o

所以显然我没有在套接字文件和我的服务器/客户端文件之间建立正确的链接。我的makefile如下:

CFLAGS= -c -Wall
object= servidor-dict.o libjsocket.o
object1 = dict.o libjsocket.o

tarea: dict servidor-dict 

servidor-dict: $(object)
    gcc -g $(object) -o servidor-dict

dict: $(object1)
    gcc -g $(object1) -o dict

%.o: %.c
    gcc $(CFLAGS) $<

servidor-dict.c: jsocket.h
dict.c: jsocket.h
libjsocket.c: jsocket.h

clean : 
    rm -rf *.o tarea
4

2 回答 2

0

我在这里看到多个问题...

  • libsocket.o应该libjsocket.o
  • libjsocket.o应该取决于某些东西(libjsocket.c?)
  • 规则servidor-dict.o:应该是servidor-dict
  • 然后servidor-dict.o缺少真正的规则(您应该考虑使用一个神奇的规则来处理所有 .o 文件的生成)

更改 Makefile 后不要忘记清理。

于 2013-06-29T00:25:36.670 回答
0

您不需要定义%.o : %.c规则,并且make应该已经知道如何使用CFLAGS. 放入会破坏它在其他地方的使用-cCFLAGS此外, .c 文件不依赖于 .h 文件,所以也许:

如果tarea是您结合所有其他 .o 文件的最终程序:

CFLAGS = -Wall

tarea: servidor-dict.o dict.o libjsocket.o
        $(CC) -o $@ $^

servidor-dict.o : servidor-dict.c jsocket.h
dict.o : dict.c jsocket.h
libjsocket.o : libjsocket.c jsocket.h

clean : 
        rm -rf *.o tarea

如果servidor-dict并且dict应该是您的最终程序:

CFLAGS = -Wall

all : dict servidor-dict
servidor-dict : servidor-dict.o libjsocket.o
        $(CC) -o $@ $^
dict : dict.o libjsocket.o
        $(CC) -o $@ $^

servidor-dict.o : servidor-dict.c jsocket.h
dict.o : dict.c jsocket.h
libjsocket.o : libjsocket.c jsocket.h

clean : 
        rm -rf *.o dict servidor-dict

警告:确定这是一个 TAB 字符进行缩进。

例如,实际上可以使用 自动生成三行组gcc -MM *.c

于 2013-06-29T06:39:44.563 回答