Problem
夜路走多了總是會碰到鬼,講述一下遇到的情形
我們有兩個Shared library,liba.so
和libb.so
內容類似如此
1 |
|
和
1 |
|
如果有個程式這樣寫
1 | void outer_a(); |
當我們編譯這個程式
1 | $ gcc main.c liba.so libb.so -o main |
結果匯出呼常理預料之外ㄝ,取決於Linking順序,跟我們想要的結果不同。
Simple Solution
將其中一個inner function加上static
即可。如
1 | static void inner() |
這樣結果就可以正常運作了,不過不適用於C++ Member Function之類的,我遇到的情形不是用這種寫法。
Best Solution (Hidden Visibility)
跟上面的方法類似,只需要將其中之一的inner隱藏寢來不可見就行了,將需要的Function輸出
1 |
|
編譯的時候就選擇
1 | $ gcc -fPIC -shared -fvisibility=hidden b.c -o libb.so |
就可以達成想要的結果了
Reference
– how to link with two shared libraries with many conflicting functions