【问题标题】:Creating shared object files from existing libraries从现有库创建共享对象文件
【发布时间】:2015-05-07 19:19:43
【问题描述】:

我正在使用 linux (Ubuntu) 并尝试从 C 代码创建一个共享库 (.so) 以用于 Java 本机接口 (JNI)。使用简单的 C 代码时,我可以使用以下命令:

gcc -shared -fpic -o Wrapper.so -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -I/usr/lib/jvm/java-7-openjdk-i386/include Wrapper.c

但是,当我尝试将现有库合并到 C 代码中时,例如:

#include <rte_memory.h>
#include <rte_memzone.h>
#include <rte_launch.h>
#include <rte_tailq.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>

我收到来自这些库的方法的未定义引用错误。我尝试使用 -I 标志为包含库的共享对象文件的目录提供路径,但没有成功。

我应该尝试链接头文件还是共享对象文件 (.so) 以及这些文件应该在哪个目录中?

我应该使用什么工具/命令来生成与 JNI 一起使用所需的共享库?

【问题讨论】:

  • 您在什么时候看到了什么错误?
  • 不清楚什么时候出现“未定义的引用错误”。您是否在编译或链接或运行时收到错误?

标签: java-native-interface shared-libraries


【解决方案1】:

我尝试使用 -I 标志为包含库的共享对象文件的目录提供路径,但没有成功。

当然:-I 标志与任何库无关。请阅读 GCC man page

我应该尝试链接头文件还是共享对象文件 (.so) 以及这些文件应该在哪个目录中?

你不能链接头文件。您只能链接目标文件、存档或共享库。

假设您的 DPDK 已安装到 /home/user/DPDK/{include,lib} 您的命令行应如下所示:

gcc -I /home/user/DPDK/include ... -shared -fPIC -o Wrapper.so \
  Wrapper.c -L /home/user/DPDK/lib -lrte_eal

如果librte_eal 构建为共享库,您可能还需要-Wl,-rpath=/home/user/DPDK/lib

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多