从.so调用符号

时间:2013-04-26 18:59:49

标签: c++ linux shared-libraries

我有一个.so库,并在其上运行nm -gC

我看到这样的输出:

0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)

我可以包含的任何标头都不包含此功能,但我想从我的cpp文件中调用它。

我该怎么做呢?

4 个答案:

答案 0 :(得分:5)

  

我可以包含的任何标题都不包含此功能,

来自nm man page

  

w ^

     

瓦特

     

符号是一个弱符号,未被特别标记为弱对象符号。

所以这是一个微弱的象征。如果没有头文件声明它,则可能无法定义它。您可能仍然会尝试自己声明并在以下情况下调用它(您需要链接到库):

void my_fun(unsigned char*, unsigned char, int);

// ...

my_fun(foo, bar, baz);

如果这是一个C ++函数,那么不能以便携方式使用dlopen() API。

答案 1 :(得分:4)

  1. 使用dlopen(3)
  2. 加载库
  3. 使用dlsym(3)获取函数的地址,并将其强制转换为相应类型的函数指针
  4. 调用函数
  5. 完成所有操作后,请使用dlclose(3)
  6. 关闭图书馆

答案 2 :(得分:1)

认识您的新friends

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
如果您希望use itmyProgram.cpp合作,那么

会将.so编译为main.cpp

g++ main.cpp -L. -lmyProgram

答案 3 :(得分:1)

您可以声明方法

void my_fun(unsigned char*, unsigned char, int);

然后尝试使用/调用它。基本上,为它创建自己的(隐式)标头。当然,它取决于库中定义的符号。