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

How to hide symbols in c++ static library?

本文关键字:隐藏 符号 静态 c++      更新时间:2023-10-16

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

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

方案:

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

我必须怎么做才能从A符号中隐藏add?因为我在链接 ld 时有 ld 的乘法定义main.

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

  • 乘法定义add(首次定义于A)
  • no .eh_frame_hdr table will be created

另外,我试图用cmake制作ACSHARED,但它像以前一样从C调用add

我排除了 B 将是"完整"静态库,没有*UND*,如果我调用addb它将从A调用addadd将从C调用。 谢谢!

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

您正在尝试执行的操作是习惯性地使用命名空间完成的。您的 A、B、C 库将在适当的命名空间中声明其所有函数。

类似的东西

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

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