linux下的makefile问题

本科微电子,研究生做软件算法,所以最近开始把C捡起来,下载了一个webbench-1.5的源码,想学习一下,可是小弟遇到一个问题,该文件夹包含两个源文件,一个是webbench.c,其中包含main函数,另一个是socket.c,其中包含一个main函数调用的socket()函数。

我用我自己的makefile给它编译结果:
这是我写的makefile

webbench:webbench.o socket.o
    gcc -o webbench webbench.o socket.o
webbench.o:webbench.c socket.c
    gcc -c webbench.c socket.c
socket.o:socket.c 
    gcc -c socket.c
clean:
    rm -f *.o

运行make后的结果:

gcc -c webbench.c socket.c
gcc -o webbench webbench.o socket.o
socket.o:在函数‘Socket’中:
socket.c:(.text+0x0): `Socket'被多次定义
webbench.o:webbench.c:(.text+0x0):第一次在此定义
collect2: error: ld returned 1 exit status
makefile:2: recipe for target 'webbench' failed
make: *** [webbench] Error 1

后来为看了一下源文件,发现webbench.c中直接用include"socket.c" 来调用socket.c中的函数,正常情况下,不应该用一个头文件socket.h声明,然后调用的源文件只需要包含头就行了啊, 可这里为什么不是这样呢?
图片描述

另外附上作者的makefile,g感觉写的很好看,请问大佬,我想看懂并学会这种写法,应该学哪些啊,网上的makefile和这种不一样啊,请前辈指教一下,谢谢!!

CFLAGS?=    -Wall -ggdb -W -O
CC?=        gcc
LIBS?=
LDFLAGS?=
PREFIX?=    /usr/local
VERSION=1.5
TMPDIR=/tmp/webbench-$(VERSION)

all:   webbench tags

tags:  *.c
    -ctags *.c

install: webbench
    install -s webbench $(DESTDIR)$(PREFIX)/bin    
    install -m 644 webbench.1 $(DESTDIR)$(PREFIX)/man/man1    
    install -d $(DESTDIR)$(PREFIX)/share/doc/webbench
    install -m 644 debian/copyright $(DESTDIR)$(PREFIX)/share/doc/webbench
    install -m 644 debian/changelog $(DESTDIR)$(PREFIX)/share/doc/webbench

webbench: webbench.o Makefile
    $(CC) $(CFLAGS) $(LDFLAGS) -o webbench webbench.o $(LIBS) 

clean:
    -rm -f *.o webbench *~ core *.core tags
    
tar:   clean
    -debian/rules clean
    rm -rf $(TMPDIR)
    install -d $(TMPDIR)
    cp -p Makefile webbench.c socket.c webbench.1 $(TMPDIR)
    install -d $(TMPDIR)/debian
    -cp -p debian/* $(TMPDIR)/debian
    ln -sf debian/copyright $(TMPDIR)/COPYRIGHT
    ln -sf debian/changelog $(TMPDIR)/ChangeLog
    -cd $(TMPDIR) && cd .. && tar cozf webbench-$(VERSION).tar.gz webbench-$(VERSION)

webbench.o:    webbench.c socket.c Makefile

.PHONY: clean install all tar
阅读 2.7k
1 个回答

那么写可能是因为作者上衣穿的是美特斯邦威,鞋子穿的是特步。

这种 Makefile 是 GNU Makefile 的写法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进