我可以通过链接这个dl从动态库加载函数,但我无法在代码中使用'dlsym'加载它而不链接这个dl

时间:2012-03-02 01:14:36

标签: c++ c linux compiler-construction linker

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

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

c ++动态库B是第三方提供的,我无法修改它。

当complinng c ++动态库A与链接c ++动态库B时,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);

1 个答案:

答案 0 :(得分:3)

你有没有考虑过名字错误? C ++标识符通常被“修改”以包含有关其命名空间和参数的信息(历史上有助于链接器区分重载函数)。您可能希望使函数extern "C"能够防止变形,或者找到与dlsym一起使用的受损名称(例如,Linx在对象上使用nm,或gcc -S -o /dev/tty ... | grep some_func on来源)。