2013-03-22 2 views
2

Я действительно неопытен, когда дело доходит до C++, поэтому я надеюсь, что это просто небольшая ошибка, которая вызывает эту ошибку. Извините, что сообщение так долго, но я попытался включить все важные детали.Неопределенный символ в общей библиотеке для JNI, исполняемый файл работает

Так вот что я пытаюсь сделать: я использую внешнюю библиотеку, которая поставляется в виде двух папок с makefile каждый. Я пытаюсь создать JNI-библиотеку с одним дополнительным файлом cpp и заголовком JNI в файле .h.

Так структура папок, как это: -> libcds/ЦСИ с Makefile, который создает libcds.a
-> SSA2 с Makefile, который создает SSA.a
-> MyFolder с моим CPP и ч файла и Makefile, который должен создать библиотеку

Так вот различные Makefiles:

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/ 

С.С. 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 

Мой Makefile:

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 работает без проблем. полученной библиотекой, однако, не может быть загружен Java с сообщением об ошибке:

неопределенного символ: _ZNSt8ios_base4InitC1Ev

Когда я использую нм, чтобы найти этот символ я получаю следующий результат:

000131b0 Вт _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

И --demangle это выглядит следующим образом: 000131b0 W wt_coder :: ~ wt_coder ()
U std :: ctype :: _ M_widen_init() const
U станд :: ostream :: ставить (символ)
U станд :: ostream :: вровень()
U станд :: ostream & станд :: ostream :: _ M_insert (без знака в длину)
U станд :: ios_base: : Init :: Init()
U станд :: ios_base :: Init :: ~ Init()
U станд :: basic_ostream> & станд :: __ 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++.

В первом случае (target test_index) все работает нормально, потому что вы используете g++ для компиляции и ссылки, и он будет ссылаться на libstdC++ неявно. В случае с общей библиотекой вы связываетесь с ld, который не связывает libstdC++ неявно.

Вы можете использовать g++ для компиляции и связывания разделяемой библиотеки или явного добавления libstdC++ с помощью -lstdc++. Либо надо работать.

0

Таким образом, проблема закончилась довольно просто: я должен был использовать г ++ для создания библиотеки, не Л.Д.

Смежные вопросы