从另一个共享对象动态加载共享对象时的约束?

dra*_*vic 6 c++ linux shared-libraries

我正在动态加载(whith dlopen())共享对象(命名libprofile1.so)main.

libprofile1.so我已经定义了工厂函数CreateProfile和类Profile.CreateProfilefunction创建一个Profile类的实例并返回一个指向它的指针.类Profile有一个方法pMethod.

在main中,在加载之后libprofile1.so,我正在调用CreateProfile方法,该方法返回指向Profile类对象的指针(调用它p).
之后,我正在调用pMethodobject p(p->pMethod)方法.在这个方法中,我正在动态加载其他共享对象(libdatasources.so).

在这个共享对象中,我有一个工厂函数CreateDataSource和类DataSource.
CreateDataSourcefunction创建一个DataSource类的实例并返回一个指向它的指针.DataSourceclass有方法dsMethod.

您可以注意到,两个共享对象的结构都是相似的.

pMethod加载后libdatasources.so我调用CreateDataSource方法,它返回一个指向DataSource类实例的指针,调用它ds.然后我调用dsMethoddsobject
(ds->dsMethod).


现在,问题是如下.

当我尝试调用dsMethodds对象,共享对象,我是第一次加载(libprofile1.so)不加载.实际上是dlopen()回归NULL.当我得到dlerror以后读书时dlopen:

./libprofile1.so: undefined symbol: _ZN18DataSource13dsMethod

所以如果我有一个电话ds->Method,那么第一个共享对象就不会加载!
如果我注释掉ds->dsMethod来自源的呼叫,那么我的libprofile1.so并且libdatasources.so没有任何问题.
我没有看到第二个SO的方法调用之间的连接,加载第一个SO ???

也许我不知道,但是从动态加载的共享对象动态加载共享对象时是否有任何约束?

顺便说一句,dlopenRTLD_NOW|RTLD_GLOBAL.我尝试过RTLD_LAZY,但仍然是同样的问题.

更新:

库是在Eclipse中构建的.两个库的G ++编译器和链接器选项相同.
这是G ++编译器:

-O0 -g3 -Wall -c -fmessage-length=0
Run Code Online (Sandbox Code Playgroud)

和G ++链接器:

-shared
Run Code Online (Sandbox Code Playgroud)

选项,粘贴自 Project Properties -> Settings -> Tool Settings

提前致谢.

Mar*_*ork 4

如果动态加载 DLL,则必须确保它没有未解析的符号。

最简单的方法是将其链接到它需要的其他 DLL,以便它们自动加载,而不必手动加载和解析所有依赖项。

因此,如果libprofile1总是使用,libdatasources请确保它们相互链接。

如果您必须手动执行此操作,请颠倒加载库的顺序。这样当你加载的时候libprofile1它所需要的函数就已经被加载了。