2011-02-01 1 views
0

저는 Java 개발자이고 Java로 액세스하기 위해 공유 객체를 빌드하기 위해 일부 C++ 코드를 컴파일합니다. 내 'so'파일을 성공적으로 빌드 할 수 있지만 Java를 사용하여로드 할 때 undefined symbol: _ZTI18TransportFormatter 오류가 발생합니다. 내 코드에서이 기호에 대한 grep을 실행했는데 기호가 TcpFormatter.o and UdpFormatter.o의 일부라는 것을 알았습니다. 다음은 make 파일입니다. 제가 여기에 뭔가 빠졌는지 말해주세요.정의되지 않은 기호 오류

P.S : ARM 프로세서에서 빌드 중입니다. 내가 이것을 빌드하고 일반 리눅스 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 = 소속 카테고리 TransportFormatter 용), 직접 dynamic_cast 또는 typeid 또는 컴파일러/링커를 호출하여 RTTI를 사용하는 것 같습니다 -fno-rtti 옵션을 통해 제공되지만 일반적으로 임베디드 플랫폼에서는 사용할 수 없습니다.

+0

ldd -d를했을 때 나는 다음과 같은 것을 가지고있다. 정의되지 않은 기호 : _ZTV18TransportFormatter (./libicmpTransfer.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 : 실제 코드가 없으면 물건을 찾아 내기가 어렵습니다. 가상 멤버 함수를 사용하지 않기 위해 일부 내용을 다시 작성해야 할 수도 있습니다. –