免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13743 | 回复: 10
打印 上一主题 下一主题

[C++] 关于 使用automake生成共享动态库(.so) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-07 16:21 |只看该作者 |倒序浏览
本帖最后由 olivia2007 于 2010-06-07 17:02 编辑

如何使用automake生成共享动态库(.so)


在网上看的automake生成动态库大都是(.la),好不容易找到了一个生成共享动态库的(.so)
如:
用automake编译共享库有多种方法,automake本身提供了对编译共享库支持,当然我们也可以不使用它的这个功能,下面分别介绍这两种方法:

一、不使用automake编译共享库功能
configure.ac和Makefile.am的配置和可执行文件基本相同,仅仅Makefile.am中的变量名有些区别,另外需要再加上“-fPIC -shared”链接选项,
如可以将“bin_”改成其它名字,如“module_”,这样就变成了:
LDFLAGS=-fPIC -shared
moduledir=$(prefix)/lib # 请注意由于module不是automake标准的名称,所以需要自己加上安装目前
module_PROGRAMS = libfoo.so
libfoo_so_SOURCES = foo.c foo.h

二、使用automake编译共享库功能
automake提供的编译共享库功能比较完善,支持同时编译出静态和共享两个,及带版号的多个版本,方法如下:
1、需要在configure.ac或configure.in文件中增加如下一句:
AC_PROG_LIBTOOL

2、在运行automake -a之前,需要执行
libtoolize -f -c

3、Makefile.am的格式有点区别,如下:
lib_LTLIBRARIES = libfoo.la  # 注意不是libfoo.so
libfoo_la_SOURCES = foo.cpp foo.h


我需要生成.so动态库,所以我选择了第一种方法,编译成功,也生成了.so文件和可执行文件,
可是,生成的可执行文件执行不了,报段错误。
通过core文件查看,也看不出错在哪。

Program terminated with signal 11, Segmentation fault.
#0  0x00000001 in ?? ()

请问有谁知道,这是为什么呢,或者有更好的用automake生成.so动态库的方法。谢谢!

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2010-06-08 09:17 |只看该作者
Makefile.am中加上一句:

libfoo_la_LDFLAGS = -module

论坛徽章:
0
3 [报告]
发表于 2010-06-08 09:33 |只看该作者
回复 2# EricFisher


    我生成的不是la库,是so库。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
4 [报告]
发表于 2010-06-08 09:36 |只看该作者
回复 3# olivia2007


    是的,但是加上这个选项,就成了.so了。

论坛徽章:
0
5 [报告]
发表于 2010-06-08 10:11 |只看该作者
1. 你可以看下configure && make后的编译展开的gcc完整编译/链接命令行, 看下生成的是否有问题。

2. .la文件就是一个文本,一般最终会生成.a 和.so两个库,la里包含了.so的一些依赖以及静态库名称等。用此方式生成的.so也没问题啊。

论坛徽章:
0
6 [报告]
发表于 2010-06-08 11:40 |只看该作者
回复 4# EricFisher

就比如这样
LDFLAGS=-fPIC -shared
moduledir=$(prefix)/lib
module_PROGRAMS = libfoo.so
libfoo_so_SOURCES = foo.c foo.h
ibfoo_la_LDFLAGS = -module

这样吗?我试了,可是没用。

论坛徽章:
0
7 [报告]
发表于 2010-06-08 12:21 |只看该作者
......你看下configure && make后的编译展开的gcc完整编译/链接命令行, 看下是否有问题。



假设库源码目录有如下文件:
Makefile.am
src1.c src1.h
src2.c src2.h
myexpfunc.h
footest.c

/////////////////////////////////////////////////////////////
Makefile.am可以如下写法:

include_HEADERS=myexpfunc.h //最终调用者所使用的动态库函数声明文件, 执行make install会将其在prefix目录下的include中

lib_LTLIBRARIES=libfoo.la
libfoo_la_LDFLAGS = -version-info  1:0:1 //可以指定下版本号,这样会生成libfoo.so.1.0.1 然后make install后会自动创建符号链接libfoo.so->libfoo.so.1.0.1

libfoo_la_SOURCES=src1.c src2.c

libfoo_la_LIBADD= //本动态库的第三方依赖库, 比如openssl 可以写为: -L /my_openssl_lib -lcrypto, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定

INCLUDES= //本动态库的第三方依赖头文件目录, 比如openssl可以写为: -I my_openssl_inc, 如果不依赖可以不写, 具体依赖目录可以在configure.in中编写--with参数指定

bin_PROGRAMS=footest //生成一个libfoo的测试程序,如果不需要则不必写, 最终make install会cp到prefix目录的bin下, 如果不想安装则写为noinst_PROGRAMS
footest_SOURCES=footest.c
footest_LDADD= ./libfoo.la

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
8 [报告]
发表于 2010-06-08 13:04 |只看该作者
回复 6# olivia2007


抱歉,我说错了。这种方式,是用来编译不以lib开头的共享库,或者称为模块(module)。

而且,这些是用automake的方法,对于普通的以lib开头的共享库,如果你用automake和libtool,可以试试

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.c foo.h

你第一个帖子里提到的方法一,其实也是用了automake,只不过,他是没有用automake自带的生成共享库的方法。所以,他把lib_LTLIBRARIES换成了module_PROGRAMS

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
9 [报告]
发表于 2010-06-08 13:07 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2010-06-08 13:32 |只看该作者
回复 9# EricFisher


    好,谢谢你!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP