未定义符号错误
问题描述:
我是一名java开发人员并编译一些C++代码来构建一个共享对象以便在Java中访问它。我可以成功地构建我的'so'文件,但是当我使用Java加载它时,我得到了undefined symbol: _ZTI18TransportFormatter
错误。我在代码中为这个符号做了一个grep,我发现符号是TcpFormatter.o and UdpFormatter.o
的一部分。以下是我的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
答
只是一个受过教育的猜测,但它看起来像你的代码使用RTTI(_ZTI18TransportFormatter =所属类别为TransportFormatter),或直接致电dynamic_cast
或typeid
或编译器/连接器将包括它无论如何,如果你不明确禁用它通过-fno-rtti
选项,但通常在嵌入式平台上不可用。
当我做了ldd -d我有以下。 undefined symbol:_ZTV18TransportFormatter(./libicmpTransfer.so) undefined symbol:_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 2011-02-01 21:22:02