这似乎是一个非常具体的问题,无论如何都无法在这些页面上找到答案......以下是:
我有一个包含以下内容的静态库:
/** --- libstatic.a / foo.h --- */
struct foo {
...
}
extern "C" CreateFoo();
包含以下内容的共享库
/** libshared_one.so / myFoo.cpp */
#include <foo.h>
struct myFoo {
...
}
extern "C" foo* CreateFoo() {
return new myFoo;
}
包含此内容的另一个共享库:
/** --- libshared_two.so / foo_factory.cpp */
#include <foo.h>
extern "C" {
void* new_Foo(...) {
foo* arg0 = CreateFoo();
return (void*)arg0;
}
}
现在,在我的申请中;我静态链接libstatic.a并动态加载(通过dlopen)我的共享对象(dlopen(“libshared_one.so”)/ dlopen(“libshared_two.so)。我期待libshared_two.so的CreateFoo()调用被链接到“强”版。然而,我得到了
undefined symbol: CreateFoo
nm -D ./libshared_two.so表明CreateFoo确实是未定义的,如何让链接器(或特别是dlopen)识别CreateFoo的定义版本?