具体记录下,如何用Automake编译静态库(.a)与动态库(.so)的流程.步骤其实都是一样的,只有configure.in 与 Makefile.am 有区别。
一。静态库(.a)configure.in :# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ([2.63])#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])AC_INIT(add.c)AM_INIT_AUTOMAKE(libcalc.la,1.0)#AC_INIT(libcalc.a,1.0,[])#AM_INIT_AUTOMAKEAC_CONFIG_SRCDIR([add.c])AC_CONFIG_HEADERS([config.h])# Checks for programs.AC_PROG_CCAC_PROG_RANLIBAC_PROG_LIBTOOL# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.#AC_CONFIG_FILES([Makefile])AC_OUTPUT(Makefile)
编译静态库需要加上 AC_PROG_RANLIBMakefile.am:二。动态库(.so)#author: XCLAUTOMAKE_OPTIONS=foreign#noinst_LIBRARIES=libcalc.lalib_LTLIBRARIES = libcalc.lalibcalc_la_LDFLAGES = -fPIC -m64libcalc_la_SOURCES=add.c sub.c
如果只想编译静态库,但不想安装到系统中,用 noinst_LIBRARIES 代替lib_LTLIBRARIES .所以noinst的比较常见。configure.in :# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ([2.63])#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])#AC_INIT(add.c)#AM_INIT_AUTOMAKE(libcalc.so,1.0,xcl_168@aliyun.com)AC_INIT(calc,1.0,xcl_168@aliyun.com)AM_INIT_AUTOMAKEAC_CONFIG_SRCDIR([add.c])AC_CONFIG_HEADERS([config.h])# Checks for programs.AC_PROG_CCAC_PROG_LIBTOOL# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT(Makefile)Makefile.am:#author: XCLAUTOMAKE_OPTIONS=foreignlib_LTLIBRARIES = libcalc.lalibcalc_la_SOURCES=add.c sub.clibcalc_la_LDFLAGES = -fPIC -m64
如果是C++动态库则要用extern "C"将要导出的函数包起来的。
再配合
--retain-symbols-file 与 --version-script 两个参数来实现Windows动态库的def文件功能。
例:
#if !defined(WIN32)
extern "C" //不加这个会乱码
{
MyINST * CreateInstance();
void DestoryInstance( MyINST * pInstance);
//__attribute__ ((visibility("default"))) MyINST * CreateInstance ()
//__attribute__ ((visibility("default"))) void DestoryInstance ( MyINST * pInstance)
}
#endif
测试环境及测试代码在 编译小结(3) 动态库(.so)编译及二种调用技巧 中
另可以看看gcc与手写Makefile编译的写法:
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168