我可以从dynamic库中加载链接这个dl的函数,但是我不能在代码中使用'dlsym'加载它,而不链接这个dl

我在Fedora 116上使用gcc / g ++,我的想法是:

c program -> load c++ dynamic library A -> load c++ dynamic library B 

c ++dynamic库B是第三方提供的,我不能修改它。

当complinng c ++dynamic库A与c ++dynamic库B链接时,A可以在B中find符号。但是当我使用'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); 

Solutions Collecting From Web of "我可以从dynamic库中加载链接这个dl的函数,但是我不能在代码中使用'dlsym'加载它,而不链接这个dl"

你考虑过名字吗? C ++标识符通常会被“破坏”,以便在其名称空间和参数中引入信息(历史上帮助链接器区分重载的函数)。 你可能想要使用extern "C"来防止篡改,或者找到与dlsym一起使用的错误名称(例如,在Linx上使用nm对象,或gcc -S -o /dev/tty ... | grep some_func在源头上)。