LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3379|回复: 6

请教:如何写makefile处理有多层目录的源代码?

[复制链接]
发表于 2006-3-7 16:51:05 | 显示全部楼层 |阅读模式
比如这样一个结构:
main/func1/func2/func3

main.c依赖func*.c。(func*.c在文件夹func*中)

如何写makefile?
或者用automake怎样生成?

看那些大程序的Makefile看得一头雾水。
发表于 2006-3-8 08:25:31 | 显示全部楼层
如果不怕麻烦,就一个个写好了,就如:

  1. prog:main.c main/func1/func1.c main/func2/func2.c ...
  2.     gcc -o prog main.c main/func1/func1.c main/func1/func2.c ..
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-8 09:58:34 | 显示全部楼层
可以用 vpath 变量
vpath %c func1:func1/func2:func1/func2/func3
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-8 12:37:47 | 显示全部楼层
一个个写当然可以。太不优雅了……而且用$@ $<还不用一个个写。只是……唉。

用automake怎么生成?它生成的东西应该比较规范。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 17:39:58 | 显示全部楼层
推荐是用autotools。

自己的工程,是多层的,贴一下:

src/Makefile.am中用SUBDIRS
  1. SUBDIRS = simgear base input_output math plot mattplot perform plugins gui zh_CN  
  2. AM_CPPFLAGS =  ${WX_CXXFLAGS}
  3. INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir) -I$(top_srcdir)/src/base
  4. bin_PROGRAMS = flashpoint nomoplot performance
  5. flashpoint_SOURCES = App.cpp
  6. flashpoint_LDADD = \
  7.              $(top_builddir)/src/gui/libGUI.a \
  8.              $(top_builddir)/src/perform/libPerform.a \
  9.              $(top_builddir)/src/mattplot/libMattPlot.a \
  10.              $(top_builddir)/src/math/libMath.la \
  11.              $(top_builddir)/src/input_output/libInputOutput.la \
  12.              $(top_builddir)/src/simgear/props/libProperties.la \
  13.              $(top_builddir)/src/simgear/xml/libExpat.la \
  14.              $(top_builddir)/src/plot/libPlot.a \
  15.              ${WX_LIBS} $(WIN32_LDADD) ${FLASHPOINT_RES}
  16. flashpoint_DEPENDENCIES = \
  17.              $(top_builddir)/src/gui/libGUI.a \
  18.              $(top_builddir)/src/perform/libPerform.a \
  19.              $(top_builddir)/src/mattplot/libMattPlot.a \
  20.              $(top_builddir)/src/math/libMath.la \
  21.              $(top_builddir)/src/input_output/libInputOutput.la \
  22.              $(top_builddir)/src/simgear/props/libProperties.la \
  23.              $(top_builddir)/src/simgear/xml/libExpat.la \
  24.              $(top_builddir)/src/plot/libPlot.a \
  25.              ${FLASHPOINT_RES}
  26. nomoplot_SOURCES = PlotApp.cpp
  27. nomoplot_LDADD = $(top_builddir)/src/mattplot/libMattPlot.a \
  28.               $(top_builddir)/src/math/libMath.la \
  29.              $(top_builddir)/src/input_output/libInputOutput.la \
  30.              $(top_builddir)/src/simgear/props/libProperties.la \
  31.              $(top_builddir)/src/simgear/xml/libExpat.la \
  32.              ${WX_LIBS} $(WIN32_LDADD) ${FLASHPOINT_RES}
  33. nomoplot_DEPENDENCIES = $(top_builddir)/src/mattplot/libMattPlot.a \
  34.               $(top_builddir)/src/math/libMath.la \
  35.              $(top_builddir)/src/input_output/libInputOutput.la \
  36.                     $(top_builddir)/src/simgear/props/libProperties.la \
  37.                     $(top_builddir)/src/simgear/xml/libExpat.la \
  38.                     $(FLASHPOINT_RES)
  39. flashpoint.res: flashpoint.rc
  40.         $(RC) $< -O coff -o $@ $(WX_INCLUDES) -I$(top_srcdir)  -I$(top_srcdir)/rc
  41. performance_SOURCES = perform.cpp
  42. performance_LDADD = \
  43.         $(top_builddir)/src/perform/libPerform.a \
  44.         $(top_builddir)/src/input_output/libInputOutput.la \
  45.         $(top_builddir)/src/math/libMath.la \
  46.         $(top_builddir)/src/base/libBase.la \
  47.         $(top_builddir)/src/simgear/props/libProperties.la \
  48.         $(top_builddir)/src/simgear/xml/libExpat.la
  49. performance_DEPENDENCIES = \
  50.         $(top_builddir)/src/perform/libPerform.a \
  51.         $(top_builddir)/src/input_output/libInputOutput.la \
  52.         $(top_builddir)/src/math/libMath.la \
  53.         $(top_builddir)/src/base/libBase.la \
  54.         $(top_builddir)/src/simgear/props/libProperties.la \
  55.         $(top_builddir)/src/simgear/xml/libExpat.la
  56. noinst_HEADERS = PlotApp.h App.h
  57. EXTRA_DIST = \
  58.         flashpoint.rc
复制代码

相应的在configure.in中加入:
  1. AC_CONFIG_FILES([
  2.         Makefile \
  3.         src/Makefile \
  4.         src/simgear/Makefile \
  5.         src/simgear/props/Makefile \
  6.         src/simgear/xml/Makefile \
  7.         src/zh_CN/Makefile \
  8.         src/base/Makefile \
  9.         src/math/Makefile \
  10.         src/input_output/Makefile \
  11.         src/plot/Makefile \
  12.         src/mattplot/Makefile \
  13.         src/perform/Makefile \
  14.         src/plugins/Makefile \
  15.         src/gui/Makefile \
  16.         rc/Makefile
  17.         ])
  18. AC_OUTPUT
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-12-24 15:58:23 | 显示全部楼层

可以在每个目录下加下个编译本目录中的.o文件的make

可以在每个目录下加下个编译本目录中的.o文件的makefile然后主目录下调用
如:
all:
        make -C ./func1
        make -C ./func2
        gcc -o xxx xxxx
回复 支持 反对

使用道具 举报

发表于 2009-12-25 15:53:01 | 显示全部楼层
Post by fire_cpp;1401724
比如这样一个结构:
main/func1/func2/func3
main.c依赖func*.c。(func*.c在文件夹func*中)
如何写makefile?
或者用automake怎样生成?
看那些大程序的Makefile看得一头雾水。


Makefile 的运用比较随意,没有一个统一的标准。只要都能达到目的就好了。

如果不想学习现成的makefile生成用的框架,那么就学习一下怎么写 Makefile

大型程序的Makefile多是生成的,对于这些程序生成的Makefile,不要去看,那是自找麻烦。

现在的生成框架很多了,比如 autotools, cmake, scons, ant 等等。总之你选一个用就好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表