簡體   English   中英

如何在C ++靜態庫中隱藏符號?

[英]How to hide symbols in c++ static library?

我將調整情況。 在這個問題中,我將Ubuntu 16.04與GCC 6.5.0和CMake 3.13.2結合使用。

我有4個靜態庫和一個可執行文件: ABCDmain A具有int add(int, int) ,僅添加2個給定的int。 B具有int addb(int, int) ,僅從A調用add Cint add(int, int)乘以2給定的int。 D具有void print()addbB調用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與AC SHARED ,但是就像以前一樣,它從C調用add

我認為除外B就成為“滿”靜態庫,沒有*UND*如果我把addb它會調用addAadd將調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM