linux - 创建.so文件

标签 linux unix compilation solaris

有一组带有 - 扩展名为.с 的文件:avl_tree.c、buf_read.c、db_prep.c、file_process.c、global_header.c、traverser.c。使用的包含文件在文件夹/usr/gcc/4.4/bin/include 中,jni.h 除外,库在文件夹/usr/gcc/4.4/bin/lib 中。如何从他们那里创建 .so 文件(如果可能的话,在此命令中指定所有选项)?我对通过 JNI 方法创建 native 方法进行通信很感兴趣。

最佳答案

您真的应该阅读 GCC 的文档。特别是 invoking GCC . program library howto也是相关的。

很多时候,一些构建器被用来驱动构建。 GNU make经常使用并且有很好的教程文档。如果您的 Makefile-s 很复杂,您可能还想使用 GNU remake调试它们(remakemake 的调试变体)。

您通常希望将每个单独的 C 源文件编译成 position independent code因为shared objects有PIC码。你可以使用

 gcc -Wall -fPIC -o foo.pic.o foo.c

将 C 源代码 foo.c 编译成位置独立的目标文件 foo.pic.o 并且您可能需要一些其他编译器选项(例如 - I添加include目录,或者-D定义一些预处理器符号,-g用于调试,-O用于优化).

我强烈建议使用 -Wall 启用几乎所有警告(并改进您的代码,直到没有给出警告为止;这会稍微提高您的代码质量)。

然后你必须将所有这些 *.pic.o 文件链接到一个共享对象中

 gcc -shared *.pic.o -o foo.so

您可以将一些共享库链接到一个共享对象中。

您可能想阅读 Levine's book on linkers and loaders

当然,如果您使用 GNU make,您将在 Makefile 中为所有这些设置规则。

你可以使用 GNU libtool还有。

也许 dlopen(3)您可能会感兴趣。

关于linux - 创建.so文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995277/

相关文章:

java运行包括来自终端的类路径

linux - 如何在一个终端上运行多个命令?

shell - 在 Solaris 8 中将 ps 输出扩展到超过 80 个字符

compilation - 在 Go 中构建和引用我自己的本地包

linux - 如何交叉编译 arm64 的 lttng-modules?

c - 我如何在客户端的 recv() 中引起 ECONNRESET?

linux - Git 服务器 - 自动(重新)推送

perl - CPAN shell 内存不足。如何在 Unix 上给它更多内存?

linux - Solaris 10 - 用数字后缀拆分

Javac 找不到类路径中引用的包