[英]How to hide symbols in c++ static library?
我將調整情況。 在這個問題中,我將Ubuntu 16.04與GCC 6.5.0和CMake 3.13.2結合使用。
我有4個靜態庫和一個可執行文件: A
, B
, C
, D
和main
。 A
具有int add(int, int)
,僅添加2個給定的int。 B
具有int addb(int, int)
,僅從A
調用add
。 C
有int add(int, int)
乘以2給定的int。 D
具有void print()
, addb
從B
調用addb
並從C
add
。 main
只是調用print()
。 所有這些功能將聲明和定義分為.cpp
和.hpp
。
方案:
A (add)
|
B (addb) C (add)
| |
|___________|
|
D (print)
|
main
我必須怎么做才能隱藏A
符號中的add
? 因為我在連接main
時從ld獲得了乘以定義。
如果我僅使用cmake進行構建,它將在兩種情況下從C
調用add
(請參閱D
print()
)。 我將B
與ld( ld -static
)鏈接,但是現在有兩個問題:
add
(首先在A
定義) no .eh_frame_hdr table will be created
另外,我嘗試使cmake與A
和C
SHARED
,但是就像以前一樣,它從C
調用add
。
我認為除外B就成為“滿”靜態庫,沒有*UND*
如果我把addb
它會調用add
的A
, add
將調用C
。 謝謝!
您違反了一個定義規則 。 簡而言之,這就是說每個函數(1)只能定義一次(除非聲明為內聯,在這種情況下所有定義都必須相同)。
您試圖做的事是慣用名稱空間完成的。 您的A,B,C庫將在適當的名稱空間中聲明其所有功能。
就像是
namespace A
{
int add(int lhs, int rhs);
};
namespace C
{
int add(int lhs, int rhs);
}
(1)一個定義規則不僅與功能有關。 在程序級別,它也適用於變量,在給定的翻譯單元中,它也擴展到模板,類類型和枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.