linux 动态库编译:.so: undefined symbol
这几天学习了下共享库相关知识,今天编码发现一点小问题(虽然是小问题,也花了几个小时查找),这里记录下,给大家作个参考。
1、问题描述
g++编译库文件,编译的时候不报错,但是运行主程序的时候会出现以下错误:
/opt/code/c++/sharelib/libshare.so: undefined symbol: my_print
1
2、解决方案
编译共享库的时候,一定要以C的方式进行编译。
纯C代码,可直接用gcc编译;
C++代码,需将对外暴露的接口(即外部可以直接调用的接口)以C方式编译,即使用extern "C" { 代码 }。
3、代码实例
共享库 sharelib.cpp:
编译:g++ -o libshare.so -fPIC -Wall -shared sharelib.cpp
include <stdio.h>
#include <iostream>
extern "C" //“my_print”是该共享库提供的对外接口,所以需要以C方式编译
{
int my_print()
{
std::cout << "hello world" << std::endl;
return 0;
}
}
1
2
3
4
5
6
7
8
9
10
11
主程序 test_sharelib.cpp:
编译:g++ -o test_sharelib -Wl,–rpath,/opt/code/c++/sharelib test_sharelib.cpp -ldl
“/opt/code/c++/sharelib” 是共享库所在目录
#include <stdio.h>
#include <iostream>
#include <dlfcn.h>
int main()
{
void* handle = NULL;
char* error;
int (*p)();
handle = dlopen("libshare.so", RTLD_LAZY);
if (NULL == handle)
{
if ((error = dlerror()) != NULL)
{
std::cout << error << std::endl;
return -1;
}
}
p = (int(*)())dlsym(handle, "my_print"); //这里查找“my_print”,所以上面的my_print函数需要以C方式编译
if ((error = dlerror()) != NULL)
{
std::cout << error << std::endl;
return -1;
}
p();
dlclose(handle);
return 0;
}
相关说明:
1、VIP会员无限制任意下载,免积分。立即前往开通>>
2、下载积分可通过日常 签到、绑定邮箱 以及 积分兑换 等途径获得!
3、本站资源大多存储在云盘,如出现链接失效请评论反馈,如有密码,均为:www.ipipn.com。
4、所有站内资源仅供学习交流使用。未经原版权作者许可,禁止用于任何商业环境,否则后果自负。为尊重作者版权,请购买正版作品。
5、站内资源来源于网络公开发表文件或网友分享,如侵犯您的权益,请联系管理员处理。
6、本站提供的源码、模板、软件工具等其他资源,都不包含技术服务,请大家谅解!
7、源码、模板等资源会随着技术、坏境的升级而存在部分问题,还请慎重选择。
PS.源码均收集自网络,如有侵犯阁下权益,请发信件至: [email protected] .
源站网 » linux 动态库编译:.so: undefined symbol