以前都是手写 makefile,没使用 automake 之类的工具,今天看了一些相关资料,简单地总结一下,留个备份。
使用 Makefile
unix/linux 下面使用相当广泛,对于简单一些的程序,手写 makefile 还是比较容易的,只要指定清目标文件,最后可执行文件的依赖关系。使用一些高级一点的功能更方便,比如下面这个就比较好用,稍微编辑一下就可以用于常用的小工程。
这个 Makefile 把所有.cpp 的文件编译成相应的.o 文件,然后链接为 Targetfile 文件。
CC = g++ -O2
LD = g++
TARGET = Targetfile
SOURCES = $(wildcard *.cpp)
OBJS = $(patsubst %.cpp,%.o,$(SOURCES))
%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@
Targetfile:$(OBJS)
$(CC) $(OBJS) -lglut -lglui -o Targetfile
clean:
@/bin/rm *.o</pre>
使用 automake 等工具
首先运行 autoscan,这之后会生成一个 configure.scan 文件,修改为 configure.in,并编辑。典型的一个文件如下,AC_CONFIG_SRCDIR,AC_CONFIG_HEADER 这两项还不知道干什么用的,如果不注释掉后面 automake 会出现错误,那就先注释掉吧。重点修改 AC_INIT,AC_INIT_AUTOMAKE。AC_CHECK 那些不用管,后面提示-lglui 提示要注意,这是需要链接的库文件,这里链接 glui 这个库。
# -- Autoconf --
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(TSPdemo, 1.0, moorekang@gamil.com)
AM_INIT_AUTOMAKE(TSPdemo, 1.0)
#AC_CONFIG_SRCDIR([Elastic_Alg.cpp])
#AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
AC_CHECK_LIB([glui], [main])
AC_CHECK_LIB([glut], [main])
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
# Checks for library functions.
AC_CHECK_FUNCS([sqrt])
#AC_CONFIG_FILES([makefile])
AC_OUTPUT(Makefile)
编写 Makefile.am,如下面这样。和 makefile 一样,写上可执行文件依赖于的源文件,_LDADD 是要链接的库文件名。
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=TSPdemo
TSPdemo_SOURCES= Elastic_Alg.cpp MyMap.cpp mathlib.cpp \
Elastic_Alg.h MyMap.h mathlib.h \
LaoMan.cpp SOM.cpp pointdef.h \
LaoMan.h SOM.h main.cpp
TSPdemo_LDADD = -lglut
然后执行 aclocal,和 autoconf,最后 automake —add-missing 生成 configure 文件。这就完成了,下面就是 unix 下编译安装软件的三个步骤了,./configure,make, makeinstall 等。
写得比较粗略,详细查看这个文档。