如何在c ++静态库中隐藏符号?

时间:2019-05-16 11:00:58

标签: c++ gcc ld

我会调整情况。 在这个问题中,我将Ubuntu 16.04与GCC 6.5.0和CMake 3.13.2结合使用。

我有4个静态库和一个可执行文件:ABCDmainA的{​​{1}}仅添加2个给定的整数。 int add(int, int)B个刚刚从int addb(int, int)呼叫add的地方。 A的{​​{1}}乘以2个给定的整数。 C具有int add(int, int),它们从D调用void print(),从addb调用B。 并且add仅调用C。 所有这些功能都将声明和定义分为mainprint()

方案:

.cpp

要从.hpp符号中隐藏A (add) | B (addb) C (add) | | |___________| | D (print) | main ,我该怎么做?因为我在链接add时有ld的乘法定义。

如果我仅使用cmake进行构建,它将在两种情况下从A调用main(请参阅add的{​​{1}})。我将C与ld(print())链接,但现在有两个问题:

  • 乘以D的定义(首先在B中定义)
  • ld -static

我也尝试用cmake制作addA no .eh_frame_hdr table will be created,但它像以前一样从A调用C

我除外,B将是“完整的”静态库,没有SHARED,如果我调用add,它将从C,{{1} }将从*UND*进行呼叫。 谢谢!

1 个答案:

答案 0 :(得分:0)

您违反了一个definition rule。简而言之,这就是每个函数(1)只能定义一次(除非声明为内联,在这种情况下所有定义都必须相同)。

您试图做的是习惯上使用名称空间。您的A,B,C库将在适当的名称空间中声明其所有功能。

类似

namespace A
{
   int add(int lhs, int rhs);
};

namespace C
{
   int add(int lhs, int rhs);
}

(1)一个定义规则不仅与功能有关。在程序级别,它也适用于变量,在给定的翻译单元中,它也扩展到模板,类类型和枚举。