用C语言制作makefile

用C语言制作makefile,c,sockets,dictionary,makefile,C,Sockets,Dictionary,Makefile,实际上,我正试图用C语言制作一个makefile,但似乎在链接所有文件时遇到了一些严重的问题。基本上,我正在尝试制作一个字典,它通过一个带有套接字的服务器运行。我初始化字典并解释文件servidor-dict.c中的请求,然后从dict.c发送请求。我还有这两个文件: o,其中包含使用套接字的基本函数(j_socket(),j_bind()…)。 h,它是libjsocket.o的头 当我运行makefile时,控制台一直告诉我: Undefined symbols for architectu

实际上,我正试图用C语言制作一个makefile,但似乎在链接所有文件时遇到了一些严重的问题。基本上,我正在尝试制作一个字典,它通过一个带有套接字的服务器运行。我初始化字典并解释文件servidor-dict.c中的请求,然后从dict.c发送请求。我还有这两个文件: o,其中包含使用套接字的基本函数(j_socket(),j_bind()…)。 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
CFLAGS=-c-Wall
object=servidor-dict.o libjsocket.o
object1=dict.o libjsocket.o
塔里亚:迪克特·塞维多迪克特
servidor dict:$(对象)
gcc-g$(对象)-o服务目录
dict:$(object1)
gcc-g$(对象1)-o指令
%.o:%.c
gcc$(CFLAGS)$<
servidor-dict.c:jsocket.h
dict.c:jsocket.h
libjsocket.c:jsocket.h
清洁:
rm-rf*.o塔雷亚酒店

我在这里看到了多个问题

  • libsocket.o
    应该是
    libjsocket.o
  • libjsocket.o
    应该依赖于某种东西(
    libjsocket.c
    ?)
  • 规则
    servidor-dict.o:
    应该是
    servidor-dict
  • <> LI>真正的规则<代码> ServordRo.Dist.O./C> >(您应该考虑使用一个神奇的规则来处理所有.O文件的生成)

更改生成文件后不要忘记清理。

您不需要定义
%.o:%.c
规则,并且
make
应该已经知道如何使用
CFLAGS
。将
-c
放在
CFLAGS
中可能会中断它在其他地方的使用。此外,.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
警告:确定是制表符在缩进


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

你确定你的makefile上写的是
libsocket.o:
而不是
libjsocket.o:
(在上面的第14行)?如果它说的是
libsocket.o
,那么它可能在其他地方找到了
libjsocket.o
,内容不同。确实存在错误。可能是我在测试其他东西时犯的错误。但它仍然不能解决我的问题。。。但谢谢你让我注意到这一点;)自动变量将帮助您避免这样的错误。我只是按照您的建议实现我的代码。奇怪的是,dict构建得很好,但不是servidor-dict。我检查了好几次名称,并尝试使用自动变量,但效果不好。谢谢!你给我的Makefile的第二个代码非常好用!我想我现在明白我的错误了。再次感谢您抽出时间!