当前位置: 首页 > 知识库问答 >
问题:

JNI共享库中未定义符号,可执行文件正在工作

尤俊誉
2023-03-14

以下是不同的Makefile:

libcds/src:

CPP=g++

CPPFLAGS=-O9 -w -DNDEBUG 

INCL=-I../includes/

CODERS_DIR=coders
CODERS_OBJECTS=$(CODERS_DIR)/huff.o $(CODERS_DIR)/huffman_codes.o

STATIC_PERMUTATION_DIR=static_permutation
STATIC_PERMUTATION_OBJECTS=$(STATIC_PERMUTATION_DIR)/perm.o ...

STATIC_BITSEQUENCE_DIR=static_bitsequence
STATIC_BITSEQUENCE_OBJECTS=$(STATIC_BITSEQUENCE_DIR)/static_bitsequence.o ..

STATIC_SEQUENCE_DIR=static_sequence
STATIC_SEQUENCE_OBJECTS=$(STATIC_SEQUENCE_DIR)/static_sequence.o, ..., wt_coder.o

UTILS_DIR=utils
UTILS_OBJECTS=$(UTILS_DIR)/alphabet_mapper_none.o $(UTILS_DIR)/alphabet_mapper.o

%.o: %.cpp

$(CPP) $(CPPFLAGS) $(INCL) -c $< -o $@

all: lib 

lib: pre $(CODERS_OBJECTS) $(STATIC_BITSEQUENCE_OBJECTS) $(STATIC_SEQUENCE_OBJECTS) $(UTILS_OBJECTS) $(STATIC_PERMUTATION_OBJECTS)
    ar rcs ../lib/libcds.a $(CODERS_OBJECTS) $(STATIC_BITSEQUENCE_OBJECTS) $(STATIC_SEQUENCE_OBJECTS) $(UTILS_OBJECTS) $(STATIC_PERMUTATION_OBJECTS)

pre:
    cp basics.h ../includes/
    cp */*.h ../includes/

SSA2:

CC=g++

CFLAGS=-w -O9 -DNDEBUG -I../libcds/includes/
CODERS_DIR=../libcds/src/coders

CODERS_OBJECTS=$(CODERS_DIR)/huff.o $(CODERS_DIR)/huffman_codes.o

STATIC_BITSEQUENCE_DIR=../libcds/src/static_bitsequence

STATIC_BITSEQUENCE_OBJECTS=$(STATIC_BITSEQUENCE_DIR)/static_bitsequence.o ...

STATIC_SEQUENCE_DIR=../libcds/src/static_sequence

STATIC_SEQUENCE_OBJECTS=$(STATIC_SEQUENCE_DIR)/static_sequence.o ...

UTILS_DIR=../libcds/src/utils

UTILS_OBJECTS=$(UTILS_DIR)/alphabet_mapper_none.o $(UTILS_DIR)/alphabet_mapper.o

all: index

# pattern rule for all objects files

%.o: %.c *.h

    $(CC) -c $(CFLAGS) $< -o $@

%.o: %.cpp *.h

    $(CC) -c $(CFLAGS) $< -o $@

index: bitrankw32int.o bitarray.o  ds/ds.o ds/globals.o ds/helped.o ds/shallow.o ds/deep2.o ds/blind2.o SSA.o

    cp ../libcds/lib/libcds.a SSA.a

    ar rcs SSA.a SSA.o bitrankw32int.o bitarray.o ds/ds.o ds/globals.o ds/shallow.o ds/helped.o ds/deep2.o ds/blind2.o
CC=g++ -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux
LD_LIBRARY_PATH=./
JNI_NAME= indexlib

all: test

%.o: %.c *.h
    $(CC) -c $(CFLAGS) $< -o $@

test_index: 
    $(CC) run_queries.c -o testIndex SSA.a

test_index_lib: run_queries.o
    ld -shared -soname lib$(JNI_NAME).so -o lib$(JNI_NAME).so run_queries.o SSA.a -lc

(std::basic_ostream>&,char const*,int)U std::__throw_bad_cast()
U std::cout

所以实际上这可能与链接器错误有关:未定义对`std::ctype ::_m_widen_init()的引用

共有1个答案

杜弘伟
2023-03-14

我认为您没有链接到C++标准库。您需要它是因为您链接到的库之一是C++。

在第一种情况下(target test_index),一切正常,因为您正在使用g++进行编译和链接,并且它将隐式链接到libstdc++。在共享库的情况下,您使用ld链接,它不会隐式链接libstdc++。

您可以使用g++编译和链接共享库,或者显式地使用-lstdc++添加libstdc++。两者都应该有效。

 类似资料:
  • 问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到

  • 我正在尝试JNI示例代码。 (您可以通过github获得以下所有源代码:https://github.com/pilhoon/jni-test) sample.java sample.c 采样.h 我在CentOS6.3上用gcc编译了这些 但是当我运行'java sample'时,出现了一个错误。 我该怎么解决这个?

  • 问题内容: 这有什么问题吗?我有以下简单的课程: 在运行一个简单的compile()之后,出现以下错误: 在共享库上运行nm表示实际上已找到它: 这是在Ubuntu 12.04上发生的。该 libmnl-dev的 和 libmnl0 包安装。的输出表明正使用该* .so文件: 问题答案: 库必须在使用它们的对象之后列出(更确切地说,仅当库包含满足遇到未定义引用的符号时,才使用库)。将移至命令末尾。

  • 问题内容: 我有一个与静态便利库链接的程序,称为它,其中包含一个函数。该函数未在中的任何地方调用;它需要能够从插件库调用。 该符号未在中动态导出。如果我跑步 我什么都没有。但是,它并不缺少: 00000000 T功能 我使用的是automake,但是如果我在命令行上手动执行最后一个链接,那么它也不起作用: 但是,如果我这样链接程序,则跳过便利库的使用,直接链接到本应直接进入的目标文件,它们会显示在

  • 我用NetBeans编写了一个程序,现在想与我的同事分享。但是,当他尝试在计算机上运行时,他会收到一条错误消息: 让人困惑的是:我在装有NetBeans的笔记本电脑上写了这篇文章,为了确保它能正常工作,我将文件夹复制到闪存驱动器上,然后在我的电脑上运行。它工作得很好。当我把它发电子邮件给我的同事时,他发现了那个错误。 根据我所看到的,一些解决方案是运行。命令行中的jar。虽然这可能会起作用,但我需

  • 我试图加载一个. so文件(libInfExprParser.so)使用JNI。我没有这个共享对象的源代码。我得到以下错误: 线程“main”java中出现异常。lang.unsatifiedlinkerror:/home/tomcat/sahiti/ExprParser/libinfexparser。所以:/home/tomcat/sahiti/ExprParser/libinexprparse