[C++] 靜態連結不同的 shared library 遇到 symbol 名稱衝突

[C++] 靜態連結不同的 shared library 遇到 symbol 名稱衝突

今天在追一個專案的問題,想說在原本的 C++ 程式裡,

把同事寫的另一個 shared library (DLL) 也加進來,

原本應該要用動態連結 (dynamic link) 的,但有點懶,就直接用靜態連結 (static link),

結果就先撞到了 symbol 同名的問題…

 

查了一下,在兩個 .so 裡面都有一個叫 AutoMutex 的 class,

但是使用 g++ -l 的方式作靜態連結時,並沒有出現警告訊息,而是在執行的時候莫名其妙的當掉了~

 

用 gdb 來單步執行,可以看到很有趣的事…

首先可以看到執行到 AutoMutex 的 constructor,這是定義在 AutoMutex.cpp 裡面的:

Breakpoint 1, AutoMutex::AutoMutex (this=0x7fffffffe1b0, mutex=..., bAcquire=false) at AutoMutex.cpp:6
6	m_bAcquire(bAcquire)

 

再執行一陣子之後,剛剛的 AutoMutex 物件要被摧毀了,因此呼叫了 AutoMutex 的 destructor…

但注意!!這邊呼叫到的是另位一個檔案 AutoMutexNew.cpp 裡定義的 AutoMutex 的 destructor…

(gdb) c
Continuing.
Breakpoint 2, AutoMutex::~AutoMutex (this=0x7fffffffe1b0, __in_chrg=<optimized out>) at ./AutoMutexNew.cpp:32
32	    {

 

這兩個 AutoMutex 的實作方式並不相同,因此當掉是可預期的…

不過 g++ 在這個例子裡面並沒有警告這件事情,倒是令人有點驚訝…

 

(本頁面已被瀏覽過 375 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料