【发布时间】:2011-12-09 04:26:46
【问题描述】:
说明:
一个。 X 类包含一个静态私有数据成员 ptr 和静态公共函数成员 getptr()/setptr()。
在 X.cpp 中,ptr 设置为 NULL。
b. libXYZ.so(共享对象)包含类 X 的对象(即 libXYZ.so 包含 X.o)。
c。 libVWX.so(共享对象)包含类 X 的对象(即 libVWX.so 包含 X.o)。
d。可执行文件 a.exe 包含 X.cpp 作为翻译单元的一部分,最后链接到 libXYZ.so、libVWX.so
PS:
1. 任何类都不涉及用户命名空间。
2. 库和可执行文件还包含许多其他类。
3. 没有执行 dlopen()。所有库都在编译时使用 -L 和 -l 标志链接。
问题陈述:
在编译 a.exe 并将其与其他库(即 libXYZ.so 和 libVWX.so)链接时,我预计会出现链接器错误(相同符号的冲突/出现多次)但没有得到。
程序执行时 - 在 SUSE 10 Linux 和 HP-UX 11 IA64 中的行为很奇怪。
在 Linux 中,当执行流被推送到不同库中的所有对象时,效果只注册在 X 的一个副本中。
在 HPUX 中,当执行流被推送到不同库中的所有对象时,效果会注册在 3 个不同的 X 副本中(2 个属于每个库,1 个用于可执行文件)
PS:我的意思是在运行程序期间,流程确实通过了属于 a.exe、libXYZ.so 和 libVWX.so 的多个对象,这些对象与属于 X 的静态指针交互。
问题:
- 预期链接器错误是否不正确?由于两个编译器无声地通过编译,因此在我缺少的这种情况下,可能有一个标准规则。如果是这样,请让我知道。
- 编译器(Linux 中的 gcc 和 HPUX 中的 aCC)如何决定在最终可执行文件中保留多少 X 副本并在这种情况下引用它们。
- gcc 和 aCC 是否支持任何标志,在这种情况下会向用户发出警告/停止编译?
提前感谢您的帮助。
【问题讨论】:
标签: c++ static compilation shared-libraries