2

私はC++に関しては本当に経験が浅いので、これがこのエラーの原因となる小さな間違いであることを願っています。投稿が長すぎて申し訳ありませんが、重要な詳細をすべて含めようとしました。

これが私がやろうとしていることです。私は、それぞれmakefileを持つ2つのフォルダーの形式で提供される外部ライブラリーを使用しています。1つの追加のcppファイルと.hファイルのJNIヘッダーを使用してJNIライブラリを作成しようとしています。

したがって、フォルダ構造は次のようになります。-
>libcds.aを作成するmakefileを含むlibcds/src->SSA.aを作成するmakefileを含むSSA2-
>cppおよびhファイルを含むmyFolderとライブラリを作成するmakefile

したがって、ここにさまざまな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

私の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 $@

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を使用してその記号を見つけると、次の結果が得られます。

000131b0 W _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 std :: ostream :: put(char)
U std :: ostream :: flush( )
U std :: ostream&std :: ostream :: _ M_insert(unsigned 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()
U std :: cout

したがって、実際にはこれはリンカーエラーに関連している可能性があります: `std :: ctype <char> :: _ M_widen_init()への未定義の参照

4

2 に答える 2

1

C++標準ライブラリにリンクしていないと思います。リンクしているライブラリの1つがC++であるため、これが必要です。

最初のケース(ターゲットtest_index)g++では、コンパイルとリンクに使用しているため、すべてが正常に機能し、暗黙的にlibstdc++にリンクします。共有ライブラリの場合、ldlibstdc++を暗黙的にリンクしないリンク先です。

を使用g++して、共有ライブラリをコンパイルおよびリンクしたり、libstdc++を明示的に追加したりでき-lstdc++ます。どちらも機能するはずです。

于 2013-03-22T19:44:28.173 に答える
0

そのため、問題は非常に単純になりました。ライブラリの作成には、ldではなくg++を使用する必要がありました。

于 2013-03-22T19:43:30.677 に答える