具體記錄下,如何用Automake編譯靜态庫(.a)與動态庫(.so)的流程. 步驟其實都是一樣的,隻有configure.in 與 Makefile.am 有差別。
一。靜态庫(.a) configure.in :
Makefile.am:# -*- 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_AUTOMAKE AC_CONFIG_SRCDIR([add.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_PROG_RANLIB AC_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_RANLIB
二。動态庫(.so) configure.in :#author: XCL AUTOMAKE_OPTIONS=foreign #noinst_LIBRARIES=libcalc.la lib_LTLIBRARIES = libcalc.la libcalc_la_LDFLAGES = -fPIC -m64 libcalc_la_SOURCES=add.c sub.c
如果隻想編譯靜态庫,但不想安裝到系統中,用 noinst_LIBRARIES 代替lib_LTLIBRARIES .是以noinst的比較常見。
# -*- 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,[email protected]) AC_INIT(calc,1.0,[email protected]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([add.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_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=foreign lib_LTLIBRARIES = libcalc.la libcalc_la_SOURCES=add.c sub.c libcalc_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編譯的寫法:
編譯小結(4) 說說靜态庫(.a)
編譯小結(5) Makefile項目實用例子
MAIL: [email protected]
BLOG: http://blog.csdn.net/xcl168