C 如何从多个静态库.a文件创建单个动态库.so文件

C 如何从多个静态库.a文件创建单个动态库.so文件,c,C,我使用leptonica(一个图像库)的功能在Windows中创建了一个DLL,并根据需要与其他库(zlib、pnglib、jpeglib、jpeg2000、libtiff)的附件一起调整它们 现在我想在Ubuntu中实现同样的功能,我已经构建了所有的支持库,并且我在按照我的要求从它们中生成一个动态库文件时遇到了困难,我已经编写了一个imaging.c文件,通过调用函数并根据leptonica的要求修改输出,现在我面临的问题是如何从中创建一个动态库.so文件,而不依赖其他文件,这样我就可以在Ub

我使用leptonica(一个图像库)的功能在Windows中创建了一个DLL,并根据需要与其他库(zlib、pnglib、jpeglib、jpeg2000、libtiff)的附件一起调整它们

现在我想在Ubuntu中实现同样的功能,我已经构建了所有的支持库,并且我在按照我的要求从它们中生成一个动态库文件时遇到了困难,我已经编写了一个imaging.c文件,通过调用函数并根据leptonica的要求修改输出,现在我面临的问题是如何从中创建一个动态库.so文件,而不依赖其他文件,这样我就可以在Ubuntu的任何其他应用程序中使用它,只需加载一个so文件。。。
此外,当我试图从imaging.c文件创建线程安全日志文件时,我还面临许多权限问题。在这里,我试图转储一个将从imaging生成的日志。因此,当我从任何包装的上层应用程序调用它时。

您可以在Linux下创建一个大的
。因此,首先编译此
文件所依赖的所有库的静态版本(取决于库的生成过程,例如,在运行
配置
时,添加
--启用静态
--禁用共享
作为参数)

将创建一个
.so
文件。根据体系结构的不同,所有代码都编译为位置独立(
-fPIC
),即将对象文件编译为

gcc -fPIC -c yourobject1.c
这也适用于静态链接库依赖项(如有必要,将
-fPIC
标志添加到makefiles)。如果动态(
.so
)和静态库(
.a
)如果存在于同一目录中,则链接器通常更喜欢动态目录。若要覆盖此目录,可以将
-Lsomepath-lsomedependency
替换为
somepath/libsomedependency.a

使用

如果
libsomedependency.a
中的某些对象未被
libbigfile.so
本身引用,而是由要最终链接的可执行文件引用


请参见此处的类似问题/答案:

您可以在Linux下创建一个大的
.so
文件,方法是首先编译此
文件所依赖的所有库的静态版本(取决于库的生成过程,例如,在运行
配置
时,添加
--启用静态
--禁用共享
作为参数)

将创建一个
.so
文件。根据体系结构的不同,所有代码都编译为位置独立(
-fPIC
),即将对象文件编译为

gcc -fPIC -c yourobject1.c
这也适用于静态链接库依赖项(如有必要,将
-fPIC
标志添加到makefiles)。如果动态(
.so
)和静态库(
.a
)如果存在于同一目录中,则链接器通常更喜欢动态目录。若要覆盖此目录,可以将
-Lsomepath-lsomedependency
替换为
somepath/libsomedependency.a

使用

如果
libsomedependency.a
中的某些对象未被
libbigfile.so
本身引用,而是由要最终链接的可执行文件引用


这里可以看到一个类似的问题/答案:

gcc-shared-obigfile.so yourobject1.o yourobject2.o-Lsomepath-lsomedependency。我使用了相同的过程,但是当我通过加载so文件从其他C程序调用函数时,它会显示错误“unreferenced function”您可以在编译
bigfile的同一系统上再次检查
ldd bigfile.so
。so
动态库的依赖项是否显示为静态链接。如果您知道在哪个
.a
文件中定义了缺少的函数,您可以指定完整路径+名称o如果
.a在链接
bigfile.so时直接使用
.a
文件,而不是使用
-L
-L
。您可以使用
nm-仅定义libsomefile.a
检查所有已定义的档案和对象符号。是否可以从C文件调用“bigfile.so”函数,在C文件中我将只链接“bigfile.so”,因此,当我运行时,不需要指定完整路径+名称…我的意思是,我想构建一个So,它将是独立的,它将不依赖于其他库。当我在该So文件上运行包装程序时,我不想链接除“bigfile.So”之外的任何其他库libsomefile的完整路径。在链接
bigfile.so
时需要指定依赖项,而不是在运行时:
gcc-shared-o bigfile.so objectfiles.o/fullpath/libdependency.a
。我没主意了。也许如果你给出你试图完成的详细信息,其他人可以进一步帮助你。gcc-shared-o bigfile.so yourboo yourobject2.o-Lsomepath-lsomedependency。我使用了相同的过程,但是当我通过加载so文件从其他C程序调用函数时,它会显示错误“unreferenced function”您可以在编译
bigfile的同一系统上再次检查
ldd bigfile.so
。so
动态库的依赖项是否显示为静态链接。如果您知道在哪个
.a
文件中定义了缺少的函数,您可以指定完整路径+名称o如果
.a在链接
bigfile.so时直接使用
.a
文件,而不是使用
-L
-L
。您可以使用
nm-仅定义libsomefile.a
检查所有已定义的档案和对象符号。是否可以从C文件调用“bigfile.so”函数,在C文件中我将只链接“bigfile.so”,这样当我跑步时
gcc -shared -o bigfile.so yourobject1.o yourobject2.o -Wl,--whole-archive /fullpath/libsomedependency.a