程序调用动态库,编译通过,调用动态库函数运行出现undefined symbol错误

    编了一个动态库,写测试程序去调用动态库,程序编译通过,调用动态库里函数出错,通过加上动态库相关依赖库以及 extern“C”声明解决该错误

 

以下,详细说明解决经过:

首先,刚编译好的动态库需要配置好配置文件,测试编译为可执行程序时需要正确的链接动态库,在这些都没问题时,编译通过,运行时报undefined symbol错误时,往下看看,或许能给你解决

1.现象分析:

错误如图:

    这三个函数都是问题动态库里函数,程序调用动态库应该是通过程序的符号表去找到这个函数再去调用,出现undefined symbol错误意味着程序的符号表中找不到这几个符号,我们可以通过 ldd -r ./app 命令看当前可执行程序app的动态库链接是否有问题。

 libz.so.1 => /usr/lib64/libz.so.1 (0x00002b1ecf5f3000)     这种情况意味着能找到该动态库

 libz.so.1 => not found           这种就是找不到动态库,

出现第二种现象你需要看一下自己的makefile或者动态库配置文件,动态库名字和路劲是否有问题。

接下来我们说一下第一种情况

2.解决方案

  (1)找到我们编译动态库的源文件,在编译指令上加上   -Xlinker --unresolved-symbols=ignore-in-shared-libs  参数,重新编译一次,看看是否是动态库在编译时在链接其他库时出现问题导致,如重新编译时出现undefined symbol:xxx,编译时加上xxx的库以及路径等。

   (2)找到重新编译好的库,输入一下指令:nm -g libXXX.so,查看该库的符号,找到问题函数,如下:

至此,我找到了我的问题了,我在编译动态库时使用g++编译,g++编译器会将函数名进行优化,以便实现c++的重载,因为此时我的函数名被优化成如上图所示,所以导致可执行程序运行时找不到对应的符号

    解决方法:给外部使用的函数需要加上声明,extern "C"     函数名 ,让编译器编译时以c语言的方式去编译,不要优化该函数名

重新编译一下动态库,nm -r 查看一下,

重新编译一下可执行程序,nm -r 查看一下,未出现undefined symbol错误;运行一下没有问题。

 

3.注意:

如果你都是用g++编译,在编译动态库的函数前加了extern "C" ,在编译可执行程序时需要调用该函数,也需要加上extern "C"去声明这个函数,否则俩者的符号还是不一样。

附上nm命令相关:

http://www.kuqin.com/aixcmds/aixcmds4/nm.htm

 

你可能感兴趣的:(程序调用动态库,编译通过,调用动态库函数运行出现undefined symbol错误)