我目前在Linux上與兩個第三方共享庫(A.so和B.so)鏈接。問題是兩者都與另一個庫靜態鏈接,因此A.so和B.so中有大約400個函數具有相同的名稱。 當我編譯並鏈接-lA -lB或-lB -lA時,根據順序,函數從A或B中分別作爲導致問題並導致代碼無法運行的函數中斷的結果。我想知道是否有一種方法可以將函數名綁定到它們的庫,這樣兩個庫可以被鏈接和使用?因爲那些重疊的函數名稱在A和B內部被內部調用,所以我不能使用objcopy等東西會對dlopen有幫助嗎?如何鏈接兩個具有許多衝突函數的共享庫
0
A
回答
4
我想知道是否有一種方法將函數名綁定到它們的庫中,這樣兩個庫都可以被鏈接和使用?
當兩個庫有聯繫,他們應該控制其出口的符號,並且應該隱藏在「其他」的庫,但他們沒有...
將dlopen的幫助?
是:如果你dlopen("A.so", RTLD_LOCAL);
和dlopen("B.so", RTLD_LOCAL);
,則兩個庫將被添加到全球範圍內,他們不會「看到」對方。
您必須從A.so
和B.so
明確查找所需的符號,但這是您可以做的最好的。
更新:
是有一個快速的方法來鏈接到靜態庫,而不從「其他」庫中導出的符號,同時建立A.so
這是最好的做在應該輸出的符號上使用-fvisibility=hidden
標誌和__attribute__((visibility("default")))
。例如:
#define EXPORTED __attribute__((visibility("default")))
struct Foo {
void EXPORTED ExportedFunction();
void EXPORTED AnotherExportedFunction();
void InternalFunction();
};
void Foo::ExportedFunction() { }
void Foo::AnotherExportedFunction() { }
void Foo::InternalFunction() { }
gcc -shared -fPIC -o foo.so foo.cc
nm -CD foo.so | grep Foo::
00000000000005fc T Foo::ExportedFunction()
0000000000000610 T Foo::InternalFunction()
0000000000000606 T Foo::AnotherExportedFunction()
沒有明確的出口管制,一切都被出口(包括InternalFunction
我們不希望)。
gcc -shared -fPIC -o foo.so foo.cc -fvisibility=hidden
nm -CD foo.so | grep Foo::
00000000000005bc T Foo::ExportedFunction()
00000000000005c6 T Foo::AnotherExportedFunction()
Voilà:只有我們明確想要導出的東西是。
相關問題
- 1. 共享庫名稱衝突
- 2. 如何從共享庫鏈接到具有相對路徑的共享庫
- 3. Android的許多鏈接的靜態庫到共享庫
- 4. 程序使用兩個衝突的共享庫
- 5. 具有多個類的C++共享庫
- 6. 共享數據庫鏈接
- 7. 將共享庫鏈接到共享庫
- 8. 鏈接共享庫
- 9. 具有單個共享數據庫的多租戶數據庫
- 10. 如何將共享庫與其他共享庫鏈接到Linux?
- 11. 多個數據庫連接衝突
- 12. 靜態和共享庫符號衝突?
- 13. 鏈接共享庫與Linux中的另一個共享庫
- 14. 鏈接一個共享庫靜態到我的共享庫
- 15. gcc的鏈接共享庫
- 16. 如何鏈接到共享庫?
- 17. 如何鏈接到共享庫在c + +
- 18. 共享數據之間的衝突
- 19. 鏈接共享庫可執行與另一個共享庫
- 20. 創建另一個共享庫時鏈接共享庫
- 21. 共享庫中庫函數的選擇性靜態鏈接
- 22. 鏈接一個特殊的共享庫
- 23. 共享git文件衝突
- 24. System.Data.SQLite鎖定/共享衝突
- 25. 鏈接到linux共享庫
- 26. 與共享庫鏈接
- 27. Android.mk:共享庫未鏈接
- 28. 鏈接到共享庫Linux
- 29. 將兩個共享庫鏈接到一些相同的符號
- 30. PhoneGap如何共享鏈接?
問:你可以從C.a中提取所有東西,並將它變成一個共享庫嗎? – paulsm4
@ paulsm4你確定能解決問題嗎? – us2012