我正在尝试通过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
关于如何获取所有内容的任何想法?谢谢
答案 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)
要编译多个文件,您需要分两个步骤进行操作:
-c
进行编译): somefile1.o : somefile1.c
gcc -c somefile1.c -o somefile1.o
somefile2.o : somefile2.c
gcc -c somefile2.c -o somefile2.o
myapp
可执行文件 myapp : somefile1.o somefile2.o
gcc somefile1.o somefile2.o -o myapp