【发布时间】:2011-12-17 19:16:25
【问题描述】:
我正在创建一个应用程序,它支持在运行时动态加载的 dll 形式的模块。代码布局如下:
-
核心 - 静态库
这具有加载共享库并调用“创建”函数的机制,该函数返回一个新的模块对象(使用共享标头)。
-
模块共享库(链接到核心静态库)
这个模块使用共享的模块头,也使用核心库中的其他类(因此它与核心库链接)。它被构建为包含来自静态库的所有符号。
测试应用程序可执行文件(链接到核心静态库)
我的行为变得古怪,似乎是零星的。它们总是以访问冲突而告终,但似乎我非常明确地设置的成员变量(整数)将在以后的函数中作为垃圾打印出来(我已经验证它们之前没有被删除)。这似乎只有在加载动态库时才会发生(即使我从不调用 create 函数)。
我的主要问题是,这里是否存在共享库中的符号与可执行文件中的符号冲突的危险(因为它们来自同一个静态库)并导致问题,即使它们来自完全相同的静态库图书馆?
【问题讨论】:
-
我目前在 OS X 上看到了这个,但它也可以在 Linux (Ubuntu) 和 Windows 上编译。我现在将在 Linux 上尝试一下,看看是否发生了同样的事情。
-
尝试在 valgrind 下运行您的程序以更好地诊断它。
-
核心库是否使用了任何无法复制的东西,例如命名文件或设备?
-
不,核心库是完全独立的。似乎问题在于我没有将核心库编译为与位置无关的代码。所有文件都有 -fPIC 参数,但静态库没有。这在 Linux 上导致了错误,但在 OS X 上却没有。我不完全理解这是如何导致我所看到的表现的,所以我现在暂缓回答我自己的问题,以防其他人愿意更好地解释它。 (另外,我正在等待确保我不再看到问题)。
标签: c++ linker shared-libraries static-libraries