automake生成静态库文件_编译小结(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,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

另可以看看gcc与手写Makefile编译的写法:

MAIL:  xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值