通用的makefile编写问题求教

jznhljg 2010-11-10 04:13:26
我想把平时常用的数据结构和日常操作写成一个函数库,如栈, 链表,结构化异常处理等等操作,放在两个目录中:
include/ 放接口文件 如a.h, b.h, c.h, d.h
src/ 放实现文件 如a.c, b.c, c.c, d.c

现在问题是,我想把这些库安装到系统库中,也就是说平时写程序的时候可以直接用
#include <my_header.h>

来调用我的库。

现在需要写一个makefile,来实现上边的需求。
另外,我装的是三系统,mac os x + windows 7 + ubuntu 10.10 ,所以希望这个makefile能够在这三个系统下通用。

谢谢各位了~
...全文
350 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2010-11-18
  • 打赏
  • 举报
回复
跨平台代码好像可以用宏来区分,采用预编译的方式
#ifdef __UNIX__
...
#else
...
#endif
jznhljg 2010-11-18
  • 打赏
  • 举报
回复
没人了吗?明天过来结贴
zougm 2010-11-17
  • 打赏
  • 举报
回复
学习学习!
赵4老师 2010-11-17
  • 打赏
  • 举报
回复
makefile的关键是里面的Tab字符必须是真正的Tab字符,而不能用空格代替。
赵4老师 2010-11-17
  • 打赏
  • 举报
回复
如果是我,我直接用STL
jznhljg 2010-11-17
  • 打赏
  • 举报
回复

A=.a
O=.o
E=
CC=cc
I=include
CFLAGS=-g -I$I
LDFLAGS=-g
LD=cc
AS=as
AR=ar ruv
RANLIB=ranlib
DIFF=diff
RM=rm -f
CUSTOM=custom.mk
EXTRAS=$(BUILDDIR)memcmp$O $(BUILDDIR)memmove$O $(BUILDDIR)strncmp$O
THREADS=$(BUILDDIR)thread$O $(BUILDDIR)swtch$O
include $(CUSTOM)
B=$(BUILDDIR)

OBJS= $Bap$O \
$Barena$O \
$Barith$O \
$Barray$O \
$Bassert$O \
$Batom$O \
$Bbit$O \
$Bchan$O \
$Bexcept$O \
$Bfmt$O \
$Blist$O \
$Bmem$O \
$Bmp$O \
$Bring$O \
$Bseq$O \
$Bset$O \
$Bstack$O \
$Bstr$O \
$Btable$O \
$Btext$O \
$Bxp$O \
$(THREADS)

EXAMPLES= $Bdouble$E \
$Bcalc$E \
$Bids$E \
$Bmpcalc$E \
$Bwf$E \
$Bxref$E \
$Bcref$E \
$Biref$E \
$Bkref$E \
$Bidents$E \
$Bwords$E \
$Bbasename$E \
$Bdirname$E \
$Bsort$E \
$Bspin$E \
$Bsieve$E

all:: $Blibcii$A $(EXAMPLES) $Bmemchk$O

$Blibcii$A:: $(OBJS) $(EXTRAS)
$(AR) $@ $(OBJS) $(EXTRAS); $(RANLIB) $@ || true

$Bap$O: src/ap.c; $(CC) $(CFLAGS) -c -o $@ src/ap.c
$Barena$O: src/arena.c; $(CC) $(CFLAGS) -c -o $@ src/arena.c
$Barith$O: src/arith.c; $(CC) $(CFLAGS) -c -o $@ src/arith.c
$Barray$O: src/array.c; $(CC) $(CFLAGS) -c -o $@ src/array.c
$Bassert$O: src/assert.c; $(CC) $(CFLAGS) -c -o $@ src/assert.c
$Batom$O: src/atom.c; $(CC) $(CFLAGS) -c -o $@ src/atom.c
$Bbit$O: src/bit.c; $(CC) $(CFLAGS) -c -o $@ src/bit.c
$Bchan$O: src/chan.c; $(CC) $(CFLAGS) -c -o $@ src/chan.c
$Bexcept$O: src/except.c; $(CC) $(CFLAGS) -c -o $@ src/except.c
$Bfmt$O: src/fmt.c; $(CC) $(CFLAGS) -c -o $@ src/fmt.c
$Blist$O: src/list.c; $(CC) $(CFLAGS) -c -o $@ src/list.c
$Bmem$O: src/mem.c; $(CC) $(CFLAGS) -c -o $@ src/mem.c
$Bmemchk$O: src/memchk.c; $(CC) $(CFLAGS) -c -o $@ src/memchk.c
$Bmp$O: src/mp.c; $(CC) $(CFLAGS) -c -o $@ src/mp.c
$Bring$O: src/ring.c; $(CC) $(CFLAGS) -c -o $@ src/ring.c
$Bseq$O: src/seq.c; $(CC) $(CFLAGS) -c -o $@ src/seq.c
$Bset$O: src/set.c; $(CC) $(CFLAGS) -c -o $@ src/set.c
$Bstack$O: src/stack.c; $(CC) $(CFLAGS) -c -o $@ src/stack.c
$Bstr$O: src/str.c; $(CC) $(CFLAGS) -c -o $@ src/str.c
$Btable$O: src/table.c; $(CC) $(CFLAGS) -c -o $@ src/table.c
$Btext$O: src/text.c; $(CC) $(CFLAGS) -c -o $@ src/text.c
$Bthread$O: src/thread.c; $(CC) $(CFLAGS) -c -o $@ src/thread.c
$Bthread-nt$O: src/thread-nt.c;$(CC) $(CFLAGS) -c -o $@ src/thread-nt.c
$Bxp$O: src/xp.c; $(CC) $(CFLAGS) -c -o $@ src/xp.c
$Bswtch$O: src/swtch.s; $(AS) -o $@ src/swtch.s

$Bmemcmp$O: src/memcmp.c; $(CC) $(CFLAGS) -c -o $@ src/memcmp.c
$Bmemmove$O: src/memmove.c; $(CC) $(CFLAGS) -c -o $@ src/memmove.c
$Bstrncmp$O: src/strncmp.c; $(CC) $(CFLAGS) -c -o $@ src/strncmp.c

$Bdouble$O: examples/double.c; $(CC) $(CFLAGS) -c -o $@ examples/double.c
$Bcalc$O: examples/calc.c; $(CC) $(CFLAGS) -c -o $@ examples/calc.c
$Bids$O: examples/ids.c; $(CC) $(CFLAGS) -c -o $@ examples/ids.c
$Bmpcalc$O: examples/mpcalc.c; $(CC) $(CFLAGS) -c -o $@ examples/mpcalc.c
$Biref$O: examples/iref.c; $(CC) $(CFLAGS) -c -o $@ examples/iref.c
$Bkref$O: examples/kref.c; $(CC) $(CFLAGS) -c -o $@ examples/kref.c
$Bidents$O: examples/idents.c; $(CC) $(CFLAGS) -c -o $@ examples/idents.c
$Bwords$O: examples/words.c; $(CC) $(CFLAGS) -c -o $@ examples/words.c
$Bbasename$O: examples/basename.c; $(CC) $(CFLAGS) -c -o $@ examples/basename.c
$Bwf$O: examples/wf.c; $(CC) $(CFLAGS) -c -o $@ examples/wf.c
$Bgetword$O: examples/getword.c; $(CC) $(CFLAGS) -c -o $@ examples/getword.c
$Bxref$O: examples/xref.c; $(CC) $(CFLAGS) -c -o $@ examples/xref.c
$Binteger$O: examples/integer.c; $(CC) $(CFLAGS) -c -o $@ examples/integer.c
$Bcref$O: examples/cref.c; $(CC) $(CFLAGS) -c -o $@ examples/cref.c
$Bsort$O: examples/sort.c; $(CC) $(CFLAGS) -c -o $@ examples/sort.c
$Bspin$O: examples/spin.c; $(CC) $(CFLAGS) -c -o $@ examples/spin.c
$Bsieve$O: examples/sieve.c; $(CC) $(CFLAGS) -c -o $@ examples/sieve.c

$Bwf$O $Bxref$O $Bgetword$O: examples/getword.h
$Bcref$O $Binteger$O: examples/integer.h

$Bdouble$E: $Bdouble$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bdouble$O $Blibcii$A
$Bcalc$E: $Bcalc$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bcalc$O $Blibcii$A
$Bids$E: $Bids$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bids$O $Blibcii$A
$Bmpcalc$E: $Bmpcalc$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bmpcalc$O $Blibcii$A
$Biref$E: $Biref$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Biref$O $Blibcii$A
$Bkref$E: $Bkref$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bkref$O $Blibcii$A
$Bidents$E: $Bidents$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bidents$O $Blibcii$A
$Bwords$E: $Bwords$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bwords$O $Blibcii$A
$Bbasename$E: $Bbasename$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bbasename$O $Blibcii$A
$Bdirname$E: $Bbasename$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bbasename$O $Blibcii$A
$Bwf$E: $Bwf$O $Bgetword$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bwf$O $Bgetword$O $Blibcii$A
$Bxref$E: $Bxref$O $Bgetword$O $Blibcii$A;$(LD) $(LDFLAGS) -o $@ $Bxref$O $Bgetword$O $Blibcii$A
$Bcref$E: $Bcref$O $Binteger$O $Blibcii$A;$(LD) $(LDFLAGS) -o $@ $Bcref$O $Binteger$O $Blibcii$A
$Bsort$E: $Bsort$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bsort$O $Blibcii$A
$Bspin$E: $Bspin$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bspin$O $Blibcii$A
$Bsieve$E: $Bsieve$O $Blibcii$A; $(LD) $(LDFLAGS) -o $@ $Bsieve$O $Blibcii$A

maxalign: $Bmaxalign$E
$Bmaxalign$E

$Bmaxalign$E: misc/maxalign.c
$(CC) -o $@ misc/maxalign.c

clean::
$(RM) $B*$O
$(RM) $(EXAMPLES)

clobber:: clean
$(RM) $Blibcii$A



# DO NOT DELETE THIS LINE -- make depend depends on it.

$Bap$O: $I/assert.h $I/except.h $I/ap.h $I/fmt.h $I/xp.h $I/mem.h
$Barena$O: $I/assert.h $I/except.h $I/arena.h
$Barith$O: $I/arith.h
$Barray$O: $I/assert.h $I/except.h $I/array.h $I/arrayrep.h $I/mem.h
$Bassert$O: $I/assert.h $I/except.h
$Batom$O: $I/atom.h $I/assert.h $I/except.h $I/mem.h
$Bbit$O: $I/assert.h $I/except.h $I/bit.h $I/mem.h
$Bchan$O: $I/assert.h $I/except.h $I/mem.h $I/chan.h $I/sem.h
$Bexcept$O: $I/assert.h $I/except.h
$Bfmt$O: $I/assert.h $I/except.h $I/fmt.h $I/mem.h
$Blist$O: $I/assert.h $I/except.h $I/mem.h $I/list.h
$Bmem$O: $I/assert.h $I/except.h $I/mem.h
$Bmemchk$O: $I/assert.h $I/except.h $I/mem.h
$Bmp$O: $I/assert.h $I/except.h $I/fmt.h $I/mem.h $I/xp.h $I/mp.h
$Bring$O: $I/assert.h $I/except.h $I/ring.h $I/mem.h
$Bseq$O: $I/assert.h $I/except.h $I/seq.h $I/array.h $I/arrayrep.h $I/mem.h
$Bset$O: $I/mem.h $I/except.h $I/assert.h $I/arith.h $I/set.h
$Bstack$O: $I/assert.h $I/except.h $I/mem.h $I/stack.h
$Bstr$O: $I/assert.h $I/except.h $I/fmt.h $I/str.h $I/mem.h
$Btable$O: $I/mem.h $I/except.h $I/assert.h $I/table.h
$Btext$O: $I/assert.h $I/except.h $I/fmt.h $I/text.h $I/mem.h
$Bthread$O: $I/assert.h $I/except.h $I/mem.h $I/thread.h $I/sem.h
$Bthread-nt$O: $I/assert.h $I/except.h $I/mem.h $I/thread.h $I/sem.h
$Bxp$O: $I/assert.h $I/except.h $I/xp.h


这是c接口与实现的makefile 在我这macbook上make不成功
a1013911535 2010-11-17
  • 打赏
  • 举报
回复
围观。。。
jznhljg 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zhao4zhong1 的回复:]

makefile的关键是里面的Tab字符必须是真正的Tab字符,而不能用空格代替。
[/Quote]
没用空格啊。。。是tab啊。
goingfly 2010-11-16
  • 打赏
  • 举报
回复
CC = gcc
OBJECT = List.o d2_04.o
TAR = test
OBJFLAG = -o
COMFLAG = -c
DEBUGFLAG = -g
WALL = -Wall

$(TAR):$(OBJECT)
$(CC) $^ $(OBJFLAG) $@ $(DEBUGFLAG) $(WALL)
%.o :%.c
$(CC) $(OBJFLAG) $@ $^ $(COMFLAG) $(DEBUGFLAG) $(WALL)

.PHONY:clean
clean:
@rm -rf $(OBJECT) $(TARGET)
@echo "rm ok"


自己改前面的标签 我用的GCC编译器
goingfly 2010-11-16
  • 打赏
  • 举报
回复
可以通用的吧`````
cheng_fengming 2010-11-16
  • 打赏
  • 举报
回复
跨平台代码好像可以用宏来区分,采用预编译的方式
#ifdef __UNIX__
...
#else
...
#endif
sfd1234 2010-11-16
  • 打赏
  • 举报
回复
太高深了,不懂的路过!
「已注销」 2010-11-16
  • 打赏
  • 举报
回复
是不是要编译好要放到系统的include文件夹下面?
jznhljg 2010-11-15
  • 打赏
  • 举报
回复
再有三天没人就结贴。。。
libinfei8848 2010-11-11
  • 打赏
  • 举报
回复
mac没有整过
libinfei8848 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhutianjin4355255 的回复:]
objects = a.o b.o c.o

edit : $(objects)
cc -o edit $(objects)

$(objects) : a.h b.h c.h
a.o b.o c.o : a.h b.h c.h


.PHONY : clean
clean :
rm edit $(objects)

没设定.h链接的.c文件,暂时就这么写了
[/Quote]

在你的基础上还需要加点
objects = a.o b.o c.o

edit : $(objects)
cc -o edit $(objects)

$(objects) : a.h b.h c.h
a.o b.o c.o : a.h b.h c.h

install:
@cp -R ${PRJROOT}/*.h $user/include
@cp -R ${PRJROOT}/*.so $user/lib
.PHONY : clean
clean :
rm edit $(objects)

大概是这样,window下我们都是直接写bat文件,执行copy到相应的vs目录下
Proteas 2010-11-11
  • 打赏
  • 举报
回复
根据系统的不同,用工具来生成不同的 makefile
jznhljg 2010-11-11
  • 打赏
  • 举报
回复
高手都去上班了? 好头疼啊...
jznhljg 2010-11-10
  • 打赏
  • 举报
回复
http://code.google.com/p/cii/downloads/list

大家看看这里,《c语言接口与实现》的源码, 我在ubuntu和mac os下make都不成功,报错说结构体重复定义 。

谁能解释下是情况不?
加载更多回复(3)

69,373

社区成员

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

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