动态库编译:.so: undefined symbol
2017-03-07 17:53
381 查看
这几天学习了下共享库相关知识,今天编码发现一点小问题(虽然是小问题,也花了几个小时查找),这里记录下,给大家作个参考。
纯C代码,可直接用gcc编译;
C++代码,需将对外暴露的接口(即外部可以直接调用的接口)以C方式编译,即使用
编译:
主程序 test_sharelib.cpp:
编译:
“/opt/code/c++/sharelib” 是共享库所在目录
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; }
相关文章推荐
- 编译curl后yum提示pycurl.so: undefined symbol: CRYPTO_set_locking_callback错误
- 解决apcu-bc在安装中出现的问题。 今天在编译安装apcu-bc时出现了:apc.so: undefined symbol: zif_apcu_store in Unknown on line 0
- Linux下编译出来的动态链接库缺少so后缀的问题解决
- MTK编译出现Undefined symbol Image$$ZI$$Limit的问题解决
- android ndk 编译静态库(.a)动态库(.so)
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- Qt源码编译完成后,执行中出现undefined symbol: _ZN16QCoreApplicationC1ERiPPci错误解决方案
- 用apache的动态so模式编写和编译php扩展
- 编译QT时出现lib/libQtGui.so: undefined reference to `ts_read_raw'的解决办法
- KeilMDK4.22 编译STM32工程报错:Error: L6218E: Undefined symbol
- skyeye启动显示ImportError:ctypes.so: undefined symbol: PyFloat_Type解决方案
- MongoDB.so: undefined symbol: HeUTF8解决方法
- FreeBSD下编译Fontconfig时提示src/.libs/libfontconfig.so: undefined reference to `xmlCreatePushParserCtxt' 的解决办法
- 如何编译成.so动态库?
- 如何用GCC编译出动态库文件(*.so)
- Win7 64 ADS1.2 编译弹出Error: L6218E: Undefined symbol sprintf (referred from 2440...)
- 用apache的动态so模式编写和编译php扩展
- 如何用GCC编译出动态库文件(*.so)
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
- 关于 xcode 工程编译报错 undefined symbol _res_9_init的解决办法