私はプロジェクトを行っています。メインプログラムは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は問題なく機能します。