Linux下makefile的写法

tzg_dzq 2009-06-23 09:06:11

Linux下的GTK+2.0编程:

有文件关系:
bankmsys.c中包含的头文件:bankmsys.h atm.h regist.h
atm.c中包含的头文件:atm.h
regist.c中包含的头文件:regist.h fileop.h
fileop.c中包含的头文件:fileop.h

---------------------------------------------
我的写法如下:

CC =gcc
pbankmsys =bankmsys
patm =atm
pregist =regist
pfileop =fileop

$(pbankmsys): $(pbankmsys).o $(patm).o $(pregist).o
$(CC) -o $(pbankmsys) $(pbankmsys).o $(patm).o $(pregist).o `pkg-config --libs gtk+-2.0`
$(pbankmsys).o : $(pbankmsys).c $(pbankmsys).h $(patm).h $(pregist).h
$(CC) -c $(pbankmsys).c `pkg-config --cflags gtk+-2.0`
$(patm).o : $(patm).c $(patm).h
$(CC) -c $(patm).c `pkg-config --cflags gtk+-2.0`
$(pregist).o : $(pregist).c $(pregist).h $(pfileop).h
$(CC) -c $(pregist).c `pkg-config --cflags gtk+-2.0`
$(pfileop).o : $(pfileop).c $(pfileop).h
$(CC) -c $(pfileop).c

clean:
-rm -f *.o
-----------------------------------------------------
运行结果如下:
$ make -f makefile.am
gcc -o bankmsys bankmsys.o atm.o regist.o `pkg-config --libs gtk+-2.0`
regist.o: In function `set_user_info':
regist.c:(.text+0x14fc): undefined reference to `generate_card_id'
collect2: ld 返回 1
make: *** [bankmsys] 错误 1

解析:
函数:set_user_info位于regist.c中。
函数:generate_card_id位于fileop.h中(不包含头文件<gtk/gtk.h>)。
---------------------------------------------------------
请问:makefile.am怎么写?

...全文
66 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
laneast 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tzg_dzq 的回复:]
同意2楼

gcc -o bankmsys bankmsys.o atm.o regist.o `pkg-config --libs  gtk+-2.0`

少链接个 fileop.o
----------------------------
为什么要加上fileop.o ???
[/Quote]

因为通常头文件中只是声明, 而 fileop.o 中才真正包含了 generate_card_id 的实现部分
tzg_dzq 2009-06-23
  • 打赏
  • 举报
回复
同意2楼

gcc -o bankmsys bankmsys.o atm.o regist.o `pkg-config --libs gtk+-2.0`

少链接个 fileop.o
----------------------------
为什么要加上fileop.o ???
WizardOz 2009-06-23
  • 打赏
  • 举报
回复
你理解错了,makefile和makefile.am不是一个东西。
你现在的需求是一个makefile文件。

CC = gcc
CFLAGS = `pkg-config --cflags gtk+-2.0`
pbankmsys =bankmsys
patm =atm
pregist =regist
pfileop =fileop

$(pbankmsys): $(pbankmsys).o $(patm).o $(pregist).o
$(CC) -o $(pbankmsys) $(pbankmsys).o $(patm).o $(pregist).o `pkg-config --libs gtk+-2.0`
$(pbankmsys).o : $(pbankmsys).c $(pbankmsys).h $(patm).h $(pregist).h
$(CC) -c $(pbankmsys).c `pkg-config --cflags gtk+-2.0`
$(patm).o : $(patm).c $(patm).h
$(CC) -c $(patm).c `pkg-config --cflags gtk+-2.0`
$(pregist).o : $(pregist).c $(pregist).h $(pfileop).h
$(CC) -c $(pregist).c `pkg-config --cflags gtk+-2.0`
$(pfileop).o : $(pfileop).c $(pfileop).h
$(CC) -c $(pfileop).c

clean:
-rm -f *.o

Makefile.am 是用来生成Makefile的,用Makefile.am的话,可以少写很多。
luc_cj 2009-06-23
  • 打赏
  • 举报
回复
$(pregist).o : $(pregist).c $(pregist).h $(pfileop).h
$(CC) -c $(pregist).c `pkg-config --cflags gtk+-2.0`
已经把fileop.h包含在regist.c的编译过程中了,还是报错的话,敢问generate_card_id是个什么结构?函数??
laneast 2009-06-23
  • 打赏
  • 举报
回复
同意2楼

gcc -o bankmsys bankmsys.o atm.o regist.o `pkg-config --libs gtk+-2.0`

少链接个 fileop.o
98440622 2009-06-23
  • 打赏
  • 举报
回复
推荐cmake
nlylidb 2009-06-23
  • 打赏
  • 举报
回复
连接少了个o文件吧
老邓 2009-06-23
  • 打赏
  • 举报
回复
linux下不用写吧,不是automake吗?
有工具可以生成的。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧