有一组带有 - 扩展名的文件。с: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 创建本地方法,我对通信感兴趣。
2 回答
你真的应该阅读 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)会让你感兴趣。
这个问题可能应该提供更多信息。
大多数源集都有一个 Makefile、配置脚本或其他一些项目来设置输出(您想要的 .so 库)。
gcc -动态 -o 文件.so 文件.c
将从其中一个源文件中创建一个 so 文件,但您可能需要所有源文件中的一个 so 文件。