C++程序编译执行碰到问题

362 阅读1分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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。重新编译之后成功。