我有一个.so库,并在其上运行nm -gC
。
我看到这样的输出:
0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)
我可以包含的任何标头都不包含此功能,但我想从我的cpp文件中调用它。
我该怎么做呢?
答案 0 :(得分:5)
我可以包含的任何标题都不包含此功能,
来自nm man page:
w ^
瓦特
符号是一个弱符号,未被特别标记为弱对象符号。
所以这是一个微弱的象征。如果没有头文件声明它,则可能无法定义它。您可能仍然会尝试自己声明并在以下情况下调用它(您需要链接到库):
void my_fun(unsigned char*, unsigned char, int);
// ...
my_fun(foo, bar, baz);
如果这是一个C ++函数,那么不能以便携方式使用dlopen()
API。
答案 1 :(得分:4)
dlopen(3)
dlsym(3)
获取函数的地址,并将其强制转换为相应类型的函数指针dlclose(3)
答案 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 it与myProgram.cpp
合作,那么会将.so
编译为main.cpp
:
g++ main.cpp -L. -lmyProgram
答案 3 :(得分:1)
您可以声明方法
void my_fun(unsigned char*, unsigned char, int);
然后尝试使用/调用它。基本上,为它创建自己的(隐式)标头。当然,它取决于库中定义的符号。