2011-02-01 21 views
0

私はJava開発者で、Javaでアクセスするための共有オブジェクトを構築するためのC++コードをコンパイルしています。私は正常に私の 'so'ファイルを構築することができますが、私はundefined symbol: _ZTI18TransportFormatterエラーを取得するJavaを使用して読み込むとき。コード内でこのシンボルのgrepを実行したところ、シンボルがの一部であることがわかりました。以下は私のmakeファイルです。私がここに何かを見つけていないか教えてください。未定義シンボルエラー

P.S:これはARMプロセッサで構築しています。私はこれを構築し、通常のLinux x86で動作させると、何の問題もありません。

ありがとうございました。

 

LD_LIBRARY_PATH=/usr/lib/gcc/arm-linux-gnueabi/4.3.3/ 
JDK_HOME=/home/skolli/native/java/include 
CC=gcc 
CCFLAGS=-c -O2 
INCLUDE_DIRS=-I$(JDK_HOME) -I$(JDK_HOME)/linux 
LIBS=/usr/lib/libstdc++.so.6 
OBJ= Clock.o Constants.o IpFullAddress.o IcmpFormatter.o IpHeaderFormatter.o TcpFormatter.o UdpFormatter.o IcmpEchoFormatter.o IcmpErrorFormatter.o NetworkHandler.o IcmpTransfer.o jni_util.o JniConnector.o 

icmpTransfer: $(OBJ) 
    $(CC) $(INCLUDE_DIRS) $(LIBS) -shared -o libicmpTransfer.so $(OBJ) 
Clock.o:  Clock.cpp Clock.h JniConnector.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
Constants.o:  Constants.cpp Constants.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $(FLAGS) $*.cpp 
IcmpFormatter.o:  IcmpFormatter.cpp IcmpFormatter.h Constants.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
IpHeaderFormatter.o: IpHeaderFormatter.cpp IpHeaderFormatter.h Exception.h JniConnector.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
TcpFormatter.o:   TcpFormatter.cpp TcpFormatter.h IpFullAddress.h IcmpFormatter.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
UdpFormatter.o:  UdpFormatter.cpp UdpFormatter.h IpFullAddress.h TcpFormatter.h IcmpFormatter.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
IcmpEchoFormatter.o: IcmpEchoFormatter.cpp IpHeaderFormatter.h IcmpFormatter.h IpHeaderFormatter.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
IcmpErrorFormatter.o: IcmpErrorFormatter.cpp IcmpErrorFormatter.h IcmpEchoFormatter.h Exception.h IpHeaderFormatter.h IpFullAddress.h Exception.h JniConnector.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
IpFullAddress.o:  IpFullAddress.cpp IpFullAddress.h Exception.h JniConnector.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
NetworkHandler.o:  NetworkHandler.cpp NetworkHandler.h Clock.h IpFullAddress.h JniConnector.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
IcmpTransfer.o:   IcmpTransfer.cpp IcmpTransfer.h IcmpFormatter.h IcmpEchoFormatter.h IcmpErrorFormatter.h IpHeaderFormatter.h NetworkHandler.h Clock.h TcpFormatter.h JniConnector.h UdpFormatter.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 
jni_util.o:   /home/skolli/native/share/TaCoreLib/jni_util.c /home/skolli/native/share/TaCoreLib/jni_util.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.c 
JniConnector.o:   JniConnector.cpp JniConnector.h ../TaCoreLib/jni_util.h com_attune_netally_ta_corelib_IcmpPacketTransfer.h Clock.h IcmpTransfer.h 
    $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $*.cpp 


clean: 
    -rm *.o 

答えて

1

だけで推測ができますが、明示的に無効にしない場合は、あなたのコードは、とにかくそれが含まれます(_ZTI18TransportFormatter = typeinfoのTransportFormatter用)、直接dynamic_castまたはtypeidやコンパイラ/リンカを呼び出すことにより、RTTIを使用するように見えますそれは-fno-rttiオプションを経由しますが、通常は埋め込みプラットフォームでは利用できません。

+0

私はldd -dを実行したとき、次のことがあります。定義されていないシンボル:_ZTV18TransportFormatter(./libicTransfer.so) 未定義シンボル:_ZTI18TransportFormatter(./libicmpTransfer.so) libstdC++。so.6 => /usr/lib/libstdc++.so.6(0x4001e000) libgcc_s.so.1 => /lib/libgcc_s.so.1(0x400f6000) libc.so.6 => /lib/libc.so.6(0x4010c000) libm.so.6 => /lib/libm.so.6(0x4023b000 ) /lib/ld-linux.so.3(0x2a000000) – M99

+0

-fno-rttiを使用して定義されていないシンボルエラーが発生しました。今私は定義されていないシンボル:_ZTV18TransportFormatterエラーがあります。ありがとう。 – M99

+0

@SatishK:いくつかの実際のコードがなければ、それは分かりにくいです。仮想メンバー機能を使用しないように、いくつかの書き換えが必要な場合があります。 –