如何从多个静态库.a文件制作单个动态库.so文件

时间:2018-12-18 01:31:27

标签: c

我已经使用leptonica(影像库)中的功能在Windows中制作了DLL,并按需要通过其他库(zlib,pnglib,jpeglib,jpeg2000,libtiff)的附件对它们进行了调节。

现在,我想在Ubuntu中进行相同的操作,这里我已经构建了所有支持库,并且我坚持按照自己的要求从它们制作单个动态库文件,我通过调用编写了Imaging.c文件功能和根据我对leptonica的要求来对输出进行模块化,现在我面临的问题是,要从该文件制作单个动态库.so文件,而又不依赖其他文件,因此我可以在其他任何应用程序上使用它Ubuntu,仅加载单个so文件... 当我试图从该Imaging.c文件中创建线程安全日志文件时,我也遇到很多权限问题。在这里,我试图转储将从Imaging.so生成的日志,以便何时从任何包装的上层应用程序调用它。.

1 个答案:

答案 0 :(得分:0)

您可以先在Linux下创建一个大的.so文件,方法是首先编译该.so文件所依赖的所有库的静态版本(取决于库的构建过程,例如添加{{1 }} --enable-static作为运行--disable-shared的参数是一种选择)。

configure

将创建一个gcc -shared -o bigfile.so yourobject1.o yourobject2.o -Lsomepath -lsomedependency 文件。根据架构,将所有代码编译为与位置无关(.so),即将目标文件编译为

,这一点很重要
-fPIC

这也适用于静态链接库依赖项(如有必要,在makefile中添加gcc -fPIC -c yourobject1.c 标志)。如果动态(-fPIC)和静态库(.so)同时存在于同一目录中,则链接程序通常会首选动态目录。要覆盖此设置,您可以将.a替换为-Lsomepath -lsomedependency

使用

somepath/libsomedependency.a

如果gcc -shared -o bigfile.so yourobject1.o yourobject2.o -Wl,--whole-archive /fullpath/libsomedependency.a 本身未引用libsomedependency.a中的某些对象,但是您要最终链接的可执行文件引用了它们。

在此处查看类似的问题/答案:https://stackoverflow.com/a/4922106/10678162