最近遇到一个问题 无法理解行为为什么会是这样.
我在某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 只会选择走一
个实作"
这件事很难碰到吗?
谢谢