4

私はプロジェクトを行っています。メインプログラムはCで記述されており、組み込みLinuxシステム上にあります。別の会社から提供されたハードウェアで、彼らのライブラリ(c言語とc ++言語の両方の静的ライブラリ)を入手しました。後で他のデバイスに移植するために、c言語のアプリケーションとリンクする新しいライブラリ(共有ライブラリ)を作成しました。 :

 their libs(static libs,c/c++) --> my libs(shared libs,c) --> my applications(c).

すべてのc静的ライブラリは私にとってはうまく機能します。c++ライブラリを使用すると、ライブラリは正常にコンパイルされますが、アプリケーションにリンクすると2つのエラーが発生します。

libplate.so:libplate.soへの未定義の参照operator delete(void*)
:への未定義の参照vtable for __cxxabiv1::__class_type_info

この共有ライブラリをコンパイルするためのmakefileパーツは次のとおりです。

CFLAGS = -Wall -mlittle-endian -I$(INC_PATH)/plate
CPPFLAGS = -Wall -mlittle-endian -I$(PLAT_PATH)/include/sfc -I$(INC_PATH)/plate
OBJ = $(patsubst %.c, %.o, $(SRC)) 
OBJ += $(patsubst %.cpp,%.o,$(SOURCPP))

$(D_LIB):$(OBJ)

$(CC) -o $(D_LIB)  -lm -lpthread -lc -shared -fPCI $(OBJ) $(LIB)
$(STRIP) -s $(D_LIB)

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

#CC use gcc

%.o :%.cpp
    $(CXX) $(CPPFLAGS)  -c $< 

#CXXはg++を使用します

(-fno-rtti -fno-exceptions)のようなCPPFLAGSのオプションを追加しましたが、機能しません

アプリケーションについては、すべてのライブラリがc言語でコンパイルされているため、makefileを以下に作成しました。

CFLAGS = -Wall -I$(INC_PATH)/logic ->I$(INC_PATH)/plate

$(BIN):$(OBJ)

$(CC) -o $(BIN) $(OBJ) -Wl,-rpath,$(LD_RUN_PATH) $(LIBS)

%.o : %.c 

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

他のシステムライブラリ(-ldl -lc)を追加しようとしましたが、機能しません。

PS:このlibをcプログラムに直接リンクすると、c++静的libは問題なく機能します。

4

1 に答える 1

4

共有ライブラリをg++でコンパイルする必要があります。また、-fPCIを間違えました。-fPICである必要があります。それか、奇妙な理由で、カットアンドペーストを使用する代わりに、ここでMakefileを再入力しました。

したがって、行は次のようになります。

$(D_LIB):$(OBJ)
    $(CXX) -o $(D_LIB) -lm -lpthread -shared -fPIC $(OBJ) $(LIB)

g ++でコンパイルすると、C ++が必要とするサポートライブラリがリンクされるだけでなく、型情報クラスや例外などの重要な情報が含まれるようになります。

リンク先のC++ライブラリがRTTIまたは例外を使用している場合は、それらをリンクする必要があります。共有オブジェクトのリンク中にフラグ-fno-rttiまたは-fno-exceptionsを指定すると、プログラムが破損するだけです。

于 2012-05-11T06:24:53.733 に答える