请达人帮忙把这条编译语句转换成makefile语法[已解决]

C、C++和Java语言
回复
basncy
帖子: 315
注册时间: 2009-11-19 10:40
送出感谢: 0
接收感谢: 1 次

请达人帮忙把这条编译语句转换成makefile语法[已解决]

#1

帖子 basncy » 2010-07-04 17:23

直接执行这条语句可以gcc -o client client.c lib/tcp_connect.c lib/readn.c lib/error.c
但我想把它写在makefile里,我的做法如下,请高手修改

目录结构

代码: 全选

/
  client.c
/lib
      tcp_connect.c 
      readn.c 
      error.c
我想在/和/lib下分别建一个makefile文件,在根目录使用make 就可以生成client文件
我写的makefile文件,请更改
/目录的makefile:

代码: 全选

CC=gcc
FLAGS=-Ilib
client: client.c lib/tcp_connect.o lib/readn.o lib/error.o
	${CC} -o client client.c $(FLAGS)
/lib目录的makefile

代码: 全选

CC=gcc
LIBS_OBJ=tcp_connect.o readn.o error.o

all: $(LIBS_OBJ):%.o:%.c
	${CC} -c $<-o $@
我想在根目录下执行make client就生成 client文件,请问这两个makefile文件应该怎样修改呢?
如果能够将这三个.o文件生成为libxxx.a库文件,然后编译client.o时直接调用这个libxxx.a文件更好,请问这样的 makefile又应该怎样写呢?
上次由 basncy 在 2010-07-05 0:34,总共编辑 1 次。
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
送出感谢: 1 次
接收感谢: 4 次
联系:

Re: 请达人帮忙把这条编译语句转换成makefile语法

#2

帖子 Kandu » 2010-07-04 18:56

你太偷懶了吧,這樣的問題看看書馬上能解決。

不管你的文件放哪裡,只要是
./client.c
./lib/**
這樣的,用下面的Makefile:
在 ./ 下

代码: 全选

NameLibs:= tcp_connect.o readn.o error.o
libs:= $(foreach tmp, $(NameLibs), lib/$(tmp))

client: client.c $(libs)
	cc -o $@ $< $(libs)
這樣就可以了,lib目錄下用不到 Makefile ,gmake的自動推導就會自動處理的。
如果你用的不是gmake, 不夠智能,那麼就把上面的 Makefile 改成

代码: 全选

NameLibs:= tcp_connect.o readn.o error.o
libs:= $(foreach tmp, $(NameLibs), lib/$(tmp))
export NameLibs  #傳遞給嵌套執行的 Makefile

client: client.c $(libs)
	cc -o $@ $< $(libs)

$(libs):
	cd lib;make
並在 lib 下增加一個 Makefile

代码: 全选

ALL: $(NameLibs)

%.o:%.c
	gcc -c -o $@ $<
basncy
帖子: 315
注册时间: 2009-11-19 10:40
送出感谢: 0
接收感谢: 1 次

Re: 请达人帮忙把这条编译语句转换成makefile语法

#3

帖子 basncy » 2010-07-04 20:39

client.c 还是报错。。说没有定义函数(这些函数在lib/*.c里面实现的),难道还在要client.c包含的头文件里给这些函数定义?
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
送出感谢: 1 次
接收感谢: 4 次
联系:

Re: 请达人帮忙把这条编译语句转换成makefile语法

#4

帖子 Kandu » 2010-07-04 22:02

ls的問題不說了。
說下庫
在 lib 目錄下的Makefile里

代码: 全选

libclient.a: $(NameLibs)
	ar rv libclient.a $(NameLibs)

%.o:%.c
	gcc -c -o $@ $<
在 ./ 下的Makefile里

代码: 全选

NameLibs:= tcp_connect.o readn.o error.o
libs:= $(foreach tmp, $(NameLibs), lib/$(tmp))
export NameLibs  #傳遞給嵌套執行的 Makefile

client: client.c lib/libclient.a
	cc -Llib -lclient -static -o $@ $< lib/libclient.a

lib/libclient.a: $(libs)
	cd lib;make
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
送出感谢: 1 次
接收感谢: 4 次
联系:

Re: 请达人帮忙把这条编译语句转换成makefile语法

#5

帖子 Kandu » 2010-07-04 22:14

論壇程式有問題, 即使包着 [code /code] tab 也不能正常顯示,居然變成空格了。

另外,此主題太水了
建議版主把此主題扔到归档区
basncy
帖子: 315
注册时间: 2009-11-19 10:40
送出感谢: 0
接收感谢: 1 次

Re: 请达人帮忙把这条编译语句转换成makefile语法

#6

帖子 basncy » 2010-07-05 0:34

非常感谢,回去再看看
回复

回到 “C/C++/Java”