繁体   English   中英

Makefile编译多个文件

[英]Makefile To Compile Multiple Files

我试图通过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

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

当前,您正在调用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

您可以在外壳程序中显式调用命令,例如gcc -c -o server.o server.c来检查每个步骤。

哦,你可以命名目标文件splinter.o这是从源文件编译splinter.c 将有与生成的可执行文件没有问题的splinter

现在,您还可以简化Makefile以使用自动变量。 请参阅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. 按照busybee的建议,将每个源文件编译为一个目标文件(请注意,仅使用-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM