2012-05-11 9 views
3

私はプロジェクトを行っています。メインプログラムは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++静的ライブラリはうまく動作します。

答えて

4

共有ライブラリをg ++でコンパイルする必要があります。また、-fPCIで間違いをしました。 -fPICでなければなりません。どちらか、またはいくつかの奇妙な理由で、カットアンドペーストを使用する代わりにここであなたのMakefileを再入力しました。 C++は、このようなタイプの情報クラスや例外などの重要な情報が含まれていることを確認しだけでなく、必要とするサポートライブラリをリンクする++グラムでコンパイル

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

ので、行は次のようになります。

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

+0

私は、追加された** - lstdC++ ** libによってcプログラムを変更しました。 -fPCIエラーのおかげで、エラーが出ることはありません。そして、私はlibのリンクにg ++を使用していません(cppファイルのみがg ++を使用します)。これはOKです。だから、共有オブジェクト中のフラグ-fno-rttiのアドバイスはプログラムを壊すでしょう、私は確信していません。とにかくありがとう! – user1388522

関連する問題