我在fedora 116上使用gcc / g ++,我的想法是:
c program -> load c++ dynamic library A -> load c++ dynamic library B
c ++动态库B是第三方提供的,我无法对其进行修改。
当用链接c 动态库B组合c 动态库A时,A可以在B中找到符号。但是当我使用’dlsym’在A代码中加载B函数(不链接)时,A告诉我
/path/to/B.so: undefined symbol: some_func
============================
使用nm -DC
0000000000014a80 T BinarySearch(int, int*, int) 0000000000007210 T CheckLicense() 0000000000009370 T GetEnd(stCha*, int&, int) 000000000000a970 T IC_Exit() 000000000000a740 T IC_Init(char const*)
错误报告:
/path/to/some.so undefined symbol: IC_Init
库A中的代码:
IC_API bool (* IC_Init)(const char *); IC_Init = (IC_API bool (*)(const char *)) dlsym(dl_ic, "IC_Init"); if(IC_Init) { printf("function loaded"); }
在库A中,它可以使用dlopen加载库B:
void *dl_ic = dlopen(ic_lib_path, RTLD_LAZY);
您考虑过改名吗?C ++标识符通常被“缠结”以在其名称空间和参数上合并信息(这在历史上可帮助链接程序区分重载函数)。您可能希望使该函数extern "C"防止变形,或找到要与之配合使用的变形名称dlsym(例如,nm在对象或gcc -S -o /dev/tty ... | grep some_func源上使用Linx时)。
extern "C"
dlsym
nm
gcc -S -o /dev/tty ... | grep some_func