首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JNI共享库中未定义的符号,可执行文件正在工作。

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

Stack Overflow用户
提问于 2013-03-22 18:37:25
回答 2查看 2.4K关注 0票数 2

当涉及到C++时,我真的没有经验,所以我希望这只是一个导致这个错误的小错误。很抱歉,这篇文章太长了,但是我试着把所有重要的细节都包括进去。

下面是我要做的事情:我使用的是一个外部库,它以两个文件夹的形式出现,每个文件夹都有一个makefile。我正在尝试创建一个JNI库,其中包含一个额外的cpp文件和.h文件中的JNI头。

所以文件夹结构是这样的:-> libcds/src带有一个生成libcds.a的makefile。

创建SSA.a的makefile的-> SSA2

使用cpp和h文件以及应该创建库的makefile的-> myFolder

以下是不同的制作方法:

libcds/src:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

我的制作文件:

代码语言:javascript
复制
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

可执行的testIndex工作时没有问题。但是,Java无法用错误消息加载结果库:

未定义符号:_ZNSt8ios_base4InitC1Ev

当我使用nm找到那个符号时,我得到了以下结果:

000131b0W _ZN8wt_coderD2Ev U _ZNKSt5ctypeIcE13_M_widen_initEv U _ZNSo3putEc U _ZNSo5flushEv U _ZNSo9_M_insertImEERSoT_ U _ZNSt8ios_base4InitC1Ev U _ZNSt8ios_base4InitD1Ev U _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i U _ZSt16__throw_bad_castv U _ZSt4cout和--解析式是这样的:000131b0W wt_coder::~wt_coder() U std::ctype::_M_widen_init() const U::ostream::put(Char) U::ostream::刷新() U::ostream&std::ostream::_M_insert(未签名的long) U std::ios_base::Init::Init() U std::ios_base::Init::~Init() U std::basic_ostream >& std::__ostream_insert (std::basic_ostream >&,char const*,int) U std::__throw_bad_cast() 科技促进署::cout

所以实际上这可能与init()有关

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-22 19:44:28

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

在第一种情况下(目标test_index),一切正常工作,因为您正在使用g++进行编译和链接,并且它将隐式地链接到libstdc++。在共享库的情况下,您要与ld链接,后者不隐式地链接libstdc++。

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-22 19:43:30

所以问题最终变得很简单:我不得不使用g++来创建库,而不是ld。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15577557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档