2013-03-22 46 views
2

对于C++,我真的没有经验,所以我希望这只是导致此错误的一个小错误。对不起,这篇文章很长,但我试图包括所有重要的细节。JNI共享库中的未定义符号,可执行文件正在工作

所以这里是我正在尝试做的:我正在使用一个外部库,每个文件夹都带有一个makefile文件。我正在尝试在一个.h文件中创建一个带有一个额外cpp文件和JNI头的JNI库。

所以的文件夹结构是这样的: - 与
创建SSA.a一个makefile> SSA2 - - 我的CPP和H文件> MyFolder文件> libcds /与创建libcds.a
一个makefile SRC这应该

所以在这里创建库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 [email protected] 

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/ 

SS A2:

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 [email protected] 

%.o: %.cpp *.h 

    $(CC) -c $(CFLAGS) $< -o [email protected] 

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 [email protected] 

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工作没有问题。

未定义的符号:_ZNSt8ios_base4InitC1Ev

当我使用纳米找到符号我得到以下结果:

得到的文库,但是不能在Java与错误信息加载

000131b0W¯¯_ZN8wt_coderD2Ev
ù_ZNKSt5ctypeIcE13_M_widen_initEv
ù_ZNSo3putEc
ü_ZNSo5flushEv
ü_ZNSo9_M_insertImEERSoT_
ü_ZNSt8ios_base4InitC1Ev
ü_ZNSt8ios_base4InitD1Ev
ü_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
ü_ZSt16__throw_bad_castv
ü_ZSt4cout

而且随着--demangle它看起来像这样:000131b0W¯¯ wt_coder ::〜wt_coder( )
U std :: ctype :: _ M_widen_init()const
ü的std :: ostream的::放(焦炭)
ü的std :: ostream的::平齐()
ü的std :: ostream的&的std :: ostream的:: _ M_insert(无符号长)
ü的std ::的ios_base: :初始化::初始化()
ü的std ::的ios_base ::初始化::〜初始化()
ü的std :: basic_ostream> &的std :: __ ostream_insert

(标准:: basic_ostream> &, char const *,int) U std :: __ throw_bad_cast()
U std :: cout

因此,实际上这可能与Linker error: undefined reference to `std::ctype<char>::_M_widen_init()

回答

1

我想你没有链接到C++标准库。你需要它,因为你链接到的一个库是C++。

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

您可以使用g++来编译和链接共享库,或者使用-lstdc++明确添加libstdC++。要么应该工作。

0

所以,问题最终是相当简单: 我只好用G ++的库创建,不是LD