用于编译多个文件的Makefile

时间:2019-07-15 05:59:23

标签: c makefile linker

我正在尝试通过Make编译我的TCP客户端服务器程序,但无法将所有内容链接在一起。

我正在使用的当前文件:

 client.c
 connectioninfo.c
 connectioninfo.h
 server.c
 splinter.c
 splinter.h

所有.c文件在其代码中都使用了两个.h文件。

这是我的makefile的样子:

 splinter : server.o client.o splint.o connectioninfo.o
 server.o: server.c splinter.h connectioninfo.h
      gcc -o server server.c
 client.o: client.c splinter.h connectioninfo.h
      gcc -o client client.c
 splint.o: splinter.c splinter.h connectioninfo.h
      gcc -o splint splinter.c
 connectioninfo.o: connectioninfo.c splinter.h connectioninfo.h
      gcc -o connectioninfo connectioninfo.c

我得到了错误:

  gcc -o server server.c
  /tmp/ccAu7sDE.o: In function `main':
  server.c:(.text+0x6e): undefined reference to `alloc_serverinfo'
  server.c:(.text+0x87): undefined reference to `getconnectioninfo'
  server.c:(.text+0xcd): undefined reference to `port'
  server.c:(.text+0xdc): undefined reference to `host'
  server.c:(.text+0xe7): undefined reference to `s_bind'
  server.c:(.text+0x1a5): undefined reference to `s_accept'
  collect2: error: ld returned 1 exit status
  Makefile:4: recipe for target 'server.o' failed
  make: *** [server.o] Error 1

关于如何获取所有内容的任何想法?谢谢

2 个答案:

答案 0 :(得分:2)

您当前正在调用gcc为每个源文件构建应用程序,而不是目标文件。请使用选项-c并为输出提供适当的文件名,例如

gcc -c -o server.o server.c

现在更改应用程序的规则,以便将其链接:

splinter : server.o client.o splint.o connectioninfo.o
    gcc -o splinter server.o client.o splint.o connectioninfo.o

要调试Makefile并查看在不执行命令的情况下将生成哪些命令,您可以使用

make -n

您可以在shell中显式调用gcc -c -o server.o server.c之类的命令来检查每个步骤。

哦,您可以命名从源文件splinter.o编译的目标文件splinter.c。生成的可执行文件splinter不会有问题。

现在,您还可以简化Makefile以使用自动变量;请参阅documentation for make

所有内容放在一起,您可以使用:

splinter : server.o client.o splinter.o connectioninfo.o
    gcc -o $@ $^

server.o: server.c splinter.h connectioninfo.h

client.o: client.c splinter.h connectioninfo.h

splinter.o: splinter.c splinter.h connectioninfo.h

connectioninfo.o: connectioninfo.c splinter.h connectioninfo.h

%.o: %.c
    gcc -o $@ $<

答案 1 :(得分:0)

要编译多个文件,您需要分两个步骤进行操作:

  1. 按照忙蜂的建议,将每个源文件编译为一个目标文件(注意使用-c进行编译):
    somefile1.o : somefile1.c
        gcc -c somefile1.c -o somefile1.o

    somefile2.o : somefile2.c
        gcc -c somefile2.c -o somefile2.o
  1. 链接目标文件-创建myapp可执行文件
    myapp : somefile1.o somefile2.o
        gcc somefile1.o somefile2.o -o myapp