0
点赞
收藏
分享

微信扫一扫

编译小结(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的比较常见。

 


   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_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项目实用例子​​


举报

相关推荐

0 条评论