您的位置:首页 > 编程语言 > C语言/C++

动态库编译:.so: undefined symbol

2017-03-07 17:53 381 查看
这几天学习了下共享库相关知识,今天编码发现一点小问题(虽然是小问题,也花了几个小时查找),这里记录下,给大家作个参考。

1、问题描述

g++编译库文件,编译的时候不报错,但是运行主程序的时候会出现以下错误:

/opt/code/c++/sharelib/libshare.so: undefined symbol: my_print


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;
}
}


主程序 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 共享库 c++
相关文章推荐