一個。類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將聲明與任何符號的衝突,除非用選項覆蓋,甚至共享庫仍然會調用它們自己的定義,否則這是致命的。 –