1.生成动态库。
1)先写configure.in,用autoscan命令生成configure.scan,然后将其重命名为configure.in,并修改其中内容如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(SimulatorAdapter,1.0)
AM_INIT_AUTOMAKE(SimulatorAdapter,1.0)
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_LIBTOOL -》这一项是必须的
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_STRUCT_TM
# Checks for library functions.
AC_OUTPUT(Makefile \
src/Makefile)
2) 编写Makefile.am,内容如下:
Makefile.am可以如下写法:
include_HEADERS=myexpfunc.h //最终调用者所使用的动态库函数声明文件, 执行make install会将其在prefix目录下的include中
lib_LTLIBRARIES=libfoo.la
libfoo_la_LDFLAGS = -shared -avoid-version -module -no-undefined //可以指定下版本号,这样会生成libfoo.so.1.0.1 然后make install后会自动创建符号链接libfoo.so->libfoo.so.1.0.1
libfoo_la_SOURCES=src1.c src2.c
libfoo_la_LIBADD= //本动态库的第三方依赖库, 比如openssl 可以写为: -L /my_openssl_lib -lcrypto, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定
INCLUDES= //本动态库的第三方依赖头文件目录, 比如openssl可以写为: -I my_openssl_inc, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定
3) 然后执行下面脚本即可:
#!/bin/bash
aclocal 1>/dev/null 2>/dev/null
autoheader 1>/dev/null 2>/dev/null
automake 1>/dev/null 2>/dev/null
autoconf 1>/dev/null 2>/dev/null
automake --add-missing
mkdir build -p
echo "Please run configure under <build> ..."
echo -e " like: \n\t../configure CPPFLAGS=\"-DDEBUG -Wall\""
2.生成静态库.
1) 执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(libhello.a,1.1,[])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
AC_PROG_RANLIB//需要加入的内容,因为使用了静态库
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
***注解:
AC_INIT(FILE)
该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版
本编号。也可以把包和版本号等信息放在AC_INIT(FILE) 宏里。
AC_PROG_CC
检查系统可用的C 编译器,若源代码是用C 写的就需要这个宏。
AC_OUTPUT(FILE)
设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果
填充到Makefile.in 文件后产生合适的 Makefile。 后面的FILE 是一个Makefile 的输出列表,
你可以选着将要输出的Makefile 的位置和个数。建议只在src 中输出Makefile。
2) 编写Makefile.am 文件
INCLUDES=include/
noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c
AUTOMAKE_OPTIONS=foreign
第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就
可以使用。
第二行表示用来生成静态库的源文件。如果要把静态库生成到其他地方,可以在=后面
加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。
第三行AUTOMAKE_OPTIONS 是Automake 的选项。Automake 主要是帮助开发 GNU 软
件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中
应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。设置为foreign 时,Automake
会改用一般软件的标准来检查。如果不加这句的话,需要在autoconf之前,先执行touch NEWS
README AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件
3) 然后执行下面脚本即可:
#!/bin/bash
aclocal 1>/dev/null 2>/dev/null
autoheader 1>/dev/null 2>/dev/null
automake 1>/dev/null 2>/dev/null
autoconf 1>/dev/null 2>/dev/null
automake --add-missing
mkdir build -p
echo "Please run configure under <build> ..."
echo -e " like: \n\t../configure CPPFLAGS=\"-DDEBUG -Wall\""
3.生成可执行文件。
1),2),3)步骤同上,只是configure.in和Makefile.am有所差别,参考下列:
configure.in文件如下:
AC_INIT(Hello.cpp, 0.1)
AM_INIT_AUTOMAKE(Hello, 0.1)
AM_CONFIG_HEADER(config.h)
#AM_CONFIG_SRCDIR([Hello.cpp])
AC_LANG_CPLUSPLUS
AC_PROG_CC
#Checks for libraries
AC_CHECK_LIB([ACE],[TAO],[TAO_PortableServer],[TAO_CosNaming])
AC_PROG_RANLIB
#Checks for header files
AC_CHECK_HEADER(['/usr/local/include'])
AC_SUBST(['/usr/local/lib'])
AC_OUTPUT(Makefile src/Makefile)
***********************
Makefile.am如下:
bin_PROGRAMS = Hello
topdir = @top_srcdir@
srcdir = @srcdir@
AM_LDFLAGS = \
$(all_libraries) \
-lpthread \
-L/opt/lib \
# The flags for compilers
#AM_CXXFLAGS = \
# -DLOCAL_CONFIG \
# -DTAO_NAMING_SERVICE
AM_CXXFLAGS = -g -Wall -O -rdynamic
# All the includes
INCLUDES = \
-I/usr/include/libxml2
Hello_SOURCES = \
$(util_Sources)
#common sources used
util_Sources = \
StringHelper.cpp
1)先写configure.in,用autoscan命令生成configure.scan,然后将其重命名为configure.in,并修改其中内容如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(SimulatorAdapter,1.0)
AM_INIT_AUTOMAKE(SimulatorAdapter,1.0)
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_LIBTOOL -》这一项是必须的
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_STRUCT_TM
# Checks for library functions.
AC_OUTPUT(Makefile \
src/Makefile)
2) 编写Makefile.am,内容如下:
Makefile.am可以如下写法:
include_HEADERS=myexpfunc.h //最终调用者所使用的动态库函数声明文件, 执行make install会将其在prefix目录下的include中
lib_LTLIBRARIES=libfoo.la
libfoo_la_LDFLAGS = -shared -avoid-version -module -no-undefined //可以指定下版本号,这样会生成libfoo.so.1.0.1 然后make install后会自动创建符号链接libfoo.so->libfoo.so.1.0.1
libfoo_la_SOURCES=src1.c src2.c
libfoo_la_LIBADD= //本动态库的第三方依赖库, 比如openssl 可以写为: -L /my_openssl_lib -lcrypto, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定
INCLUDES= //本动态库的第三方依赖头文件目录, 比如openssl可以写为: -I my_openssl_inc, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定
3) 然后执行下面脚本即可:
#!/bin/bash
aclocal 1>/dev/null 2>/dev/null
autoheader 1>/dev/null 2>/dev/null
automake 1>/dev/null 2>/dev/null
autoconf 1>/dev/null 2>/dev/null
automake --add-missing
mkdir build -p
echo "Please run configure under <build> ..."
echo -e " like: \n\t../configure CPPFLAGS=\"-DDEBUG -Wall\""
2.生成静态库.
1) 执行autoscan 生成configure.scan 文件,将它重命名为configure.in 并修改其内容。
#configure.in
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(libhello.a,1.1,[])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
AC_PROG_RANLIB//需要加入的内容,因为使用了静态库
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
***注解:
AC_INIT(FILE)
该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版
本编号。也可以把包和版本号等信息放在AC_INIT(FILE) 宏里。
AC_PROG_CC
检查系统可用的C 编译器,若源代码是用C 写的就需要这个宏。
AC_OUTPUT(FILE)
设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果
填充到Makefile.in 文件后产生合适的 Makefile。 后面的FILE 是一个Makefile 的输出列表,
你可以选着将要输出的Makefile 的位置和个数。建议只在src 中输出Makefile。
2) 编写Makefile.am 文件
INCLUDES=include/
noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c
AUTOMAKE_OPTIONS=foreign
第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就
可以使用。
第二行表示用来生成静态库的源文件。如果要把静态库生成到其他地方,可以在=后面
加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。
第三行AUTOMAKE_OPTIONS 是Automake 的选项。Automake 主要是帮助开发 GNU 软
件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中
应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。设置为foreign 时,Automake
会改用一般软件的标准来检查。如果不加这句的话,需要在autoconf之前,先执行touch NEWS
README AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件
3) 然后执行下面脚本即可:
#!/bin/bash
aclocal 1>/dev/null 2>/dev/null
autoheader 1>/dev/null 2>/dev/null
automake 1>/dev/null 2>/dev/null
autoconf 1>/dev/null 2>/dev/null
automake --add-missing
mkdir build -p
echo "Please run configure under <build> ..."
echo -e " like: \n\t../configure CPPFLAGS=\"-DDEBUG -Wall\""
3.生成可执行文件。
1),2),3)步骤同上,只是configure.in和Makefile.am有所差别,参考下列:
configure.in文件如下:
AC_INIT(Hello.cpp, 0.1)
AM_INIT_AUTOMAKE(Hello, 0.1)
AM_CONFIG_HEADER(config.h)
#AM_CONFIG_SRCDIR([Hello.cpp])
AC_LANG_CPLUSPLUS
AC_PROG_CC
#Checks for libraries
AC_CHECK_LIB([ACE],[TAO],[TAO_PortableServer],[TAO_CosNaming])
AC_PROG_RANLIB
#Checks for header files
AC_CHECK_HEADER(['/usr/local/include'])
AC_SUBST(['/usr/local/lib'])
AC_OUTPUT(Makefile src/Makefile)
***********************
Makefile.am如下:
bin_PROGRAMS = Hello
topdir = @top_srcdir@
srcdir = @srcdir@
AM_LDFLAGS = \
$(all_libraries) \
-lpthread \
-L/opt/lib \
# The flags for compilers
#AM_CXXFLAGS = \
# -DLOCAL_CONFIG \
# -DTAO_NAMING_SERVICE
AM_CXXFLAGS = -g -Wall -O -rdynamic
# All the includes
INCLUDES = \
-I/usr/include/libxml2
Hello_SOURCES = \
$(util_Sources)
#common sources used
util_Sources = \
StringHelper.cpp