本文已参与「新人创作礼」活动,一起开启掘金创作之路。
linux程序执行报错undefinedsymbol:_ZTVN10_cxxabiv117_class_type_infoE
linux程序执行时报错
undefinedsymbol:_ZTVN10_cxxabiv117_class_type_infoE
编辑
遇到过多次类似问题,编译的时候报字母和数字组合的函数undefinedsymbol,函数前以_下划线开头,找不到函数名,就考虑程序为C++程序,而我们使用了gcc编译器,Linux系统程序报错。
解决方案:
编译的时候,需要使用g++编译,不能使用gcc编译,编译通过,执行报错。
dlsym调用,报错undefinedsymbol:
C++程序test.cpp
使用g++编译生成动态库
//函数名
int test()
{//函数实现
}
g++ -shared -o libtest.so -fPIC test.c
使用dlsym调用test时,报错undefinedsymbol:test
使用nm查看动态库内函数,nm libtest.so
发现存在_Z4testv。原函数test,生成动态库之后,原函数名变成_Z4testv。
使用dlsym直接调用_Z4testv
dlsym(p_handle,"_Z4testv")
则不报错
make报错
make报错,解决方案添加-l指定库文件。
下面两种现象,可以通过下面解决方案解决问题:
make 报错
1、undefined reference to symbol *** DSO missing *** /usr/bin/ld:/home/..../lib111.so:undefined reference to symbol '***'
/home/.../lib222.so:error adding symbols:DSO missing from commadn line
collect2:错误:ld 返回1
make报错解决方案: makefile中gcc后添加函数所在的库,假设函数已经被编译成了lib222.so,makefile中在gcc后边添加-l222。重新编译之后成功。
2、对***未定义的引用
make报错解决方案:
makefile中gcc后添加函数所在的库,假设函数已经被编译成了lib222.so,makefile中在gcc后边添加-l222。重新编译之后成功。