调用符号来自.so
Calling symbol from .so
我有一个。so库,在它上面运行nm -gC
。
我看到这样的输出:
0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)
我可以包含的所有头文件都不包含此函数,但我想从我的cpp文件中调用它。
我该怎么做呢?
我可以包含的所有头文件都不包含这个函数,
从nm手册页:
W w该符号是一个弱符号,没有被特别标记为弱对象符号。
是个弱符号。如果没有头文件声明它,则可能没有定义它。您仍然可以尝试自己声明它,并在它(您需要链接到库)的情况下调用它:
void my_fun(unsigned char*, unsigned char, int);
// ...
my_fun(foo, bar, baz);
如果这是一个c++函数,那么就不能以可移植的方式使用dlopen()
API。
- 加载
dlopen(3)
库 - 使用
dlsym(3)
获取函数的地址,并将其转换为适当类型的函数指针 - 调用函数
- 当你全部完成后,用
dlclose(3)
关闭库
你可以直接声明方法
void my_fun(unsigned char*, unsigned char, int);
,然后尝试使用/call它。基本上,为它创建自己的(隐式)标题。当然,这取决于你在库中定义的符号
认识你的新朋友:
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
wikipedia总结了大多数平台动态库加载机制,我一直使用它。
g++ -shared -fPIC myProgram.cpp -o libmyprogram.so
将myProgram.cpp
编译为.so
,如果您想将其与main.cpp
一起使用:
g++ main.cpp -L. -lmyProgram
相关文章:
- 添加符号 libgtest.so 错误:命令行中缺少 DSO
- libstdc++.so.6:添加符号时出错:命令行中缺少 DSO
- 'dlopen''ing 包含符号的 .so 会导致未定义的符号
- 自定义 Python 构建 - time.so:未定义的符号:PyExc_ValueError
- C++调用lua_dostring来加载具有"require('cjson')"的Lua Scrip引发错误:cjson.so:未定义的符号:lua_getfield
- g++ 未定义的引用,尽管符号存在于 *.so 文件中
- Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的
- 部署后的Linux qt应用程序-符号查找错误:libQt5Core.so.5未定义的符号:uncv_getDefaul
- 崩溃调查,正在从.so文件中恢复符号
- .so中存在的符号已编译.o引用了它,但链接失败
- libopencv_core.so.2.4:错误添加符号:命令行中缺少DSO
- 在Python脚本中加载.SO文件时未定义的符号错误
- 如何在OSX中打印.so文件的符号列表
- ImportError: /usr/lib/libboost_python.so.1.54.0: 未定义的符号: PyC
- C++ 在 Win DLL 到 Linux SO 转换中将 LPBYTE 更改为无符号字符*后编译器错误
- 如何解决libmysqlclient_r.so符号引用链接错误
- 对符号'BIO_ctrl@@libcrypto.so.10'的未定义引用
- 即使符号存在于.so文件中,也无法加载该符号
- 警告:编译到.so时找不到入口符号start-
- so中未定义的符号(在链接对象中定义)