私はプロジェクトを行っています。メインプログラムはCで書かれていますが、それは組み込みLinuxシステム上にあります。他の会社から提供されているハードウェアは、そこにlibs(CとC++の両方の静的なlibs)を持っています。後で他のデバイスに移植するために、私は新しいlibs(共有ライブラリ)を作成しました。c/C++で書かれた共有ライブラリを使用したLinux Cプログラム
libplate.so:C++ LIBS、私のLIBSは良いコンパイルが、私のアプリケーションにリンクするとき2つのエラーが出てくるとやったときに
their libs(static libs,c/c++) --> my libs(shared libs,c) --> my applications(c).
すべてのc静的LIBSは、私にとっては良い作品:定義されていない参照
operator delete(void*)
libplate.so:未定義参照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使用のgcc
%.o :%.cpp
$(CXX) $(CPPFLAGS) -c $<
#CXX利用グラム++
私は(-fno-rttiを-fno-例外)のようなCPPFLAGSのオプションを追加した、彼らdo not work
すべてのライブラリがコンパイルされているためC言語でdが、私は私のメイクのbelownを作った:
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 $<
私はそれがない作品を行い、いくつかの他のシステムのlibs(-ldl -lc)を追加しようとしています。
PS:このlibをcプログラムに直接リンクすると、C++静的ライブラリはうまく動作します。
私は、追加された** - lstdC++ ** libによってcプログラムを変更しました。 -fPCIエラーのおかげで、エラーが出ることはありません。そして、私はlibのリンクにg ++を使用していません(cppファイルのみがg ++を使用します)。これはOKです。だから、共有オブジェクト中のフラグ-fno-rttiのアドバイスはプログラムを壊すでしょう、私は確信していません。とにかくありがとう! – user1388522