调用符号来自.so

Calling symbol from .so

本文关键字:so 符号 调用      更新时间:2023-10-16

我有一个。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。

  1. 加载dlopen(3)
  2. 使用dlsym(3)获取函数的地址,并将其转换为适当类型的函数指针
  3. 调用函数
  4. 当你全部完成后,用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