一个。类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标志进行链接。
问题陈述:
当编译,并与其他库(即libXYZ.so和libVWX.so)连接a.exe的,我期待一个链接错误(冲突/相同的次数符号多次),但没有得到一个。
当在执行程序 - 行为是SUSE Linux的10和HP-UX 11 IA64奇怪。
在Linux中,当执行流被推送到不同库中的所有对象时,效果仅在X的一个副本中注册。
在HPUX中,当执行流被推送到不同库中的所有对象时,效果为在3个不同的充X(2属于每个库和1用于可执行)
PS副本注册:在运行节目期间我的意思是,该流程也传递thourgh属于A.EXE,libXYZ.so多个对象和libVWX.so),其与静态指针交互属于X.
问:
- 期待链接错误不正确?由于两个编译器默默地通过了编译,可能会有一个标准规则来处理这种类型的场景,而我错过了。如果是这样,请让我知道一样。
- 如何(在HPUX GCC在Linux和ACC)编译器决定X的多少副本保留在最终的可执行文件,并在这样的情况下是指他们。
- gcc和aCC是否支持任何标志,这会在这种情况下警告/停止编译给用户?
感谢您的帮助提前。
你的答案看起来是最合乎逻辑的。所以已经授予你积分。唯一值得一提的问题是 - 有没有办法在链接时发现这些问题 - 链接器会在哪里发出错误?如果您知道,请让我知道。 –
@kumar_m_kiran:不幸的是它是系统特定的。 ELF链接器将声明两个.o文件中的符号之间的冲突,除非这些符号很弱(在C++内联方法和模板实例较弱或者可以使用__attribute__),并且不会声明与库中的符号(按设计)冲突。另一方面,Windows将声明与任何符号的冲突,除非用选项覆盖,甚至共享库仍然会调用它们自己的定义,否则这是致命的。 –