【问题标题】:Undefined Symbol Error未定义符号错误
【发布时间】:2011-02-01 20:40:11
【问题描述】:

我是一名 Java 开发人员,正在编译一些 C++ 代码来构建一个共享对象以在 Java 中访问它。我可以成功构建我的“so”文件,但是当我使用 Java 加载它时,我得到undefined symbol: _ZTI18TransportFormatter 错误。我在我的代码中为这个符号做了一个 grep,我发现这个符号是TcpFormatter.o and UdpFormatter.o 的一部分。以下是我的制作文件。如果我在这里遗漏了什么,请告诉我。

P.S:我正在 ARM 处理器上构建它。当我构建它并在常规的 linux x86 上运行时,我没有任何问题。

提前致谢。

LD_LIBRARY_PATH=/usr/lib/gcc/arm-linux-gnueabi/4.3.3/ JDK_HOME=/home/skolli/native/java/include 抄送=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 常量.o:常量.cpp 常量.h $(CC) $(INCLUDE_DIRS) $(CCFLAGS) $(FLAGS) $*.cpp IcmpFormatter.o:IcmpFormatter.cpp IcmpFormatter.h 常量.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 干净的: -rm *.o

【问题讨论】:

    标签: java c++ c gcc arm


    【解决方案1】:

    只是一个有根据的猜测,但看起来您的代码使用 RTTI(_ZTI18TransportFormatter = TransportFormatter 的 typeinfo),或者直接通过调用 dynamic_casttypeid 或者编译器/链接器无论如何都会包含它,如果您没有明确禁用它通过-fno-rtti 选项,但这通常在嵌入式平台上不可用。

    【讨论】:

    • 当我做 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)
    • 我使用 -fno-rtti 解决了一个未定义的符号错误。现在我只有未定义的符号:_ZTV18TransportFormatter 错误。谢谢。
    • @SatishK:没有一些实际代码,很难弄清楚。您可能需要重写一些东西以不使用虚拟成员函数。
    猜你喜欢
    • 2012-10-10
    • 2013-10-22
    • 2014-06-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多