天天看點

編譯小結(7)Automake編譯靜态庫與動态庫

  具體記錄下,如何用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_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  

   Makefile.am:

#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的比較常見。  

二。動态庫(.so)    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,[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: XCL
AUTOMAKE_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

繼續閱讀