0

有一组带有 - 扩展名的文件。с: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 创建本地方法,我对通信感兴趣。

4

2 回答 2

1

你真的应该阅读 GCC 的文档。尤其是调用 GCC程序库 howto也是相关的。

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

您通常希望将每个单独的 C 源文件编译成与位置无关的代码,因为共享对象具有 PIC 代码。您可以使用

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

要将 C 源代码编译foo.c为与位置无关的目标文件foo.pic.o,您可能需要一些其他编译器选项(例如-I,添加包含目录,或-D定义一些预处理器符号,-g用于调试和-O优化)。

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

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

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

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

您可能想阅读Levine 关于链接器和加载器的书

当然,如果您使用 GNU make,您将拥有Makefile所有这一切的规则。

你也可以使用GNU libtool

也许dlopen(3)会让你感兴趣。

于 2012-10-21T06:19:53.443 回答
0

这个问题可能应该提供更多信息。

大多数源集都有一个 Makefile、配置脚本或其他一些项目来设置输出(您想要的 .so 库)。

gcc -动态 -o 文件.so 文件.c

将从其中一个源文件中创建一个 so 文件,但您可能需要所有源文件中的一个 so 文件。

于 2012-10-21T05:35:44.553 回答