如何隐藏 C++ 静态库中的符号?

How to hide symbols in c++ static library?

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

我有 4 个静态库和一个可执行文件:ABCDmainAint add(int, int) 只需添加 2 个给定的整数。 Bint addb(int, int)A 调用 addCint add(int, int) 乘以 2 个给定的整数。 Dvoid print()B 调用 addb 并从 C 调用 add。 而 main 只是调用 print()。 所有这些函数将声明和定义拆分为 .cpp.hpp.

方案:

A (add)
  |
B (addb)    C (add)
  |           |
  |___________|
        |
      D (print)
        |
       main

我必须怎么做才能从 A 符号中隐藏 add?因为我有 ld 的多重定义,当 linking main.

如果我只是用 cmake 构建,它会在两种情况下从 C 调用 add(参见 D 中的 print())。我 link B 与 ld (ld -static),但现在我有两个问题:

此外,我尝试使用 cmake 制作 AC SHARED,但它像以前一样从 C 调用 add

我除外,B 将是 "full" 静态库,没有 *UND*,如果我调用 addb,它将从 A 调用 addadd 将从 C 呼叫。 谢谢!

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

您尝试做的事情通常是使用名称空间完成的。您的 A、B、C 库将在适当的命名空间中声明它们的所有函数。

类似

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

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

(1) 一个定义规则不只是函数。在程序级别,它也适用于变量,并且在给定的翻译单元中,它还扩展到模板、class 类型和枚举。