【问题标题】:Creation of.so of files创建.so文件
【发布时间】:2012-10-21 05:30:09
【问题描述】:

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

【问题讨论】:

    标签: linux unix compilation solaris


    【解决方案1】:

    你真的应该阅读 GCC 的文档。值得注意的是invoking GCCprogram 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 添加包含目录,或 -D 定义一些预处理器符号,@987654338 @ 用于调试,-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) 会让你感兴趣。

    【讨论】:

    • 为什么选择 - Wall 是必要的?
    • 选项-Wall 会为您提供来自编译器的警告,并且警告通常会捕捉到容易出现的错误。你可以在 stackoverflow 上找到很多“愚蠢”的问题,这些问题会被 -Wall
    【解决方案2】:

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

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

    gcc -dynamic -o file.so file.c

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

    【讨论】:

    • 我建议gcc -Wall -shared -fPIC file.c -o file.so
    • @BasileStarynkevitch 为什么选择 - Wall 是必要的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2016-01-12
    相关资源
    最近更新 更多