2

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

我看到这样的输出:

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

我可以包含的所有标题都不包含此函数,但我想从我的 cpp 文件中调用它。

我该怎么做呢?

4

4 回答 4

5

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

nm 手册页

W

w

该符号是一个弱符号,尚未专门标记为弱对象符号。

所以它是一个弱符号。如果没有头文件声明它,那么它可能没有被定义。您可能仍然尝试自己声明并调用它以防万一(您需要链接到库):

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

// ...

my_fun(foo, bar, baz);

如果这是一个 C++ 函数,那么您不能以可移植的方式使用dlopen()API。

于 2013-04-26T19:04:03.613 回答
4
  1. 加载库dlopen(3)
  2. 用 获取函数的地址dlsym(3),并将其转换为适当类型的函数指针
  3. 调用函数
  4. 完成后,关闭库dlclose(3)
于 2013-04-26T19:02:25.563 回答
1

认识你的新朋友

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为:.somain.cpp

g++ main.cpp -L. -lmyProgram
于 2013-04-26T19:03:15.557 回答
1

你可以只声明方法

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

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

于 2013-04-26T19:04:02.783 回答