我正在使用JNI作为Scala软件和动态本机库之间的接口,我们称之为libnative.so。
部分所述本机代码使用openmp来执行一些并行操作。因此,在构建此动态库时,我将'-fopenmp'指定为CFLAG和LINKFLAG。
编译过程中没有错误。但是,在运行时间上,我得到了这个:
java:符号查找错误:/tmp/jni-5458866585640472540/libnative.so: 未定义的符号:GOMP_parallel
当使用objdump来探索库中包含的符号时,会找到引用的符号,尽管它似乎被标记为未定义:
$ objdump -TC libnative.so | grep "OMP"
0000000000000000 D *UND* 0000000000000000 GOMP_parallel
在探索此错误一段时间之后,在我看来,对外部库(例如openmp)的引用实际上必须是未定义的并在运行时加载。我也在想,JRE无法在系统执行时找到这样的库。
这些假设是真的吗?怎么可以解决这个问题?
提前谢谢大家。
答案 0 :(得分:0)
<强>修正:强>
从多个静态库构建动态库时,我们需要将 -fopenmp 添加到此过程中,即使我们已经为每个所述模块执行了此操作。