未定义的符号错误 [英] Undefined Symbol Error

查看:330
本文介绍了未定义的符号错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一个Java开发人员和编译一些C ++ code建立一个共享对象访问它在Java中。我可以成功打造我的',所以'文件,但是当我使用Java加载它,我得到未定义的符号:_ZTI18TransportFormatter 错误。我做了这个符号grep命令在我的code和我发现符号是的一部分TcpFormatter.o和UdpFormatter.o 。以下是我的make文件。请告诉我,如果我在这里缺少什么。

P.S:我建立这个在ARM处理器上。当我建立这个并定期Linux x86上运行,我没有问题。

先谢谢了。

LD_LIBRARY_PATH = / usr / lib目录/ GCC / ARM-Linux的gnueabi / 4.3.3 /
JDK_HOME = /家庭/ skolli /本地/ JAVA /包括
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.oicmpTransfer:$(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)$(标志)$ *。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)$ *。ç
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


解决方案

只是一个猜测,但它看起来像你的code使用RTTI(_ZTI18TransportFormatter =所属类别为TransportFormatter),或者直接致电的dynamic_cast 的typeid 或编译器/连接器将包括它无论如何,如果你不明确地通过 -fno禁用-rtti 选项,但是这通常在嵌入式平台上不可用。

I am a java developer and compiling some C++ code to build a Shared Object to access it in Java. I can successfully build my 'so' file but when I load it using Java I get undefined symbol: _ZTI18TransportFormatter error. I did a grep for this symbol in my code and I found that the symbol is part of TcpFormatter.o and UdpFormatter.o. Following is my make file. Please tell me if I am missing anything here.

P.S: I am building this on ARM processor. When I build this and run on a regular linux x86, I have no problems.

Thanks in Advance.


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

解决方案

Just an educated guess but it looks like your code uses RTTI (_ZTI18TransportFormatter = typeinfo for TransportFormatter), either directly by calling dynamic_cast or typeid or the compiler/linker will include it anyway if you don't explicitly disable it via the -fno-rtti option, but that's usually not available on embedded platforms.

这篇关于未定义的符号错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆