繁体   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