最近遇到一個問題 無法理解行為為什麼會是這樣.
我在某static lib 稱作libS.a 裡面實作了一個簡單的singleton (介面為GetInst)
我有兩個dynamic lib, (libA.so, libB.so) 都使用這S.a , 而E.exe是link 這兩個.so
而沒有直接使用.a
附上Cmake file 可以比較明確知道關係
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
add_library(S STATIC s.cpp)
add_library(S2 STATIC s2.cpp) <==這邊故意改成S2 讓他變成兩個.a
add_library(A SHARED a.cpp)
target_link_libraries(A PRIVATE S)
add_library(B SHARED b.cpp)
target_link_libraries(B PRIVATE S2) <==故意, 原本寫S也是一樣結果
add_executable(E main.cpp)
target_link_libraries(E PRIVATE A B S S2)
我的問題是
因為是.a 我用nm看A.so跟B.so裡面都有 "GetInst"這symbol
我預期他們各自有獨立的singleton, 意思是從GetInst拿到的instance要不一樣
我用E.exe去驗證這件事, 沒想到 拿到的竟然是一樣的instance,
我故意夾個log 並且把s.cpp 複製一份叫做s2.cpp 然後產出libS2.a 如上CMake所述
我能發現的是 E.exe執行的時候 最後呼叫到static library的時候 他只會走其中一個
實作
這邊給我的感覺可能扯到ODR, 但我整件事兜不起來覺得很困惑
如果今天libS.a不是static而是libS.so, 整件事應該相當合理
可是它是static lib 最後卻只有一份
是有什麼設定我沒有做 還是這非常正常....如果是可否給我一些觀念上的補充
因為以我這簡單的lib間的關係
難道"兩個.so 用到不同的.a 而這不同的.a有相同symbol 最後產出的exe 只會選擇走一
個實作"
這件事很難碰到嗎?
謝謝