仅 C++ 标头库的隐藏可见性

问题描述 投票:0回答:1

我正在尝试了解 C++ 对于仅标头库的可见性,并希望确保我对此有正确的理解。我目前使用的是 Clang 15.0.6 编译器。

因此,根据我的理解/阅读,如果我在共享库 A.so 中有方法,如下所示

#define ATTRIBUTE_HIDDEN __attribute__((__visibility__("hidden")))

ATTRIBUTE_HIDDEN int foo (){
   return 5;
}
int bar(){
   return 6;
}

如果我们使用

-fvisibility=hidden
标志构建 A.so,它将强制隐藏所有标有
ATTRIBUTE_HIDDEN
宏的符号的可见性,这会阻止它们跨库边界可见。因此,如果 B.so 现在与 A.so 链接,则 B.so 中的代码只能调用 bar() 方法,而不能调用 foo() 方法。是这样吗?

此外,如果现在我们有一个仅包含头文件的库 C

add_library(C INTERFACE .)
并且让我们说它包含一个具有以下方法的 util.h

#define ATTRIBUTE_HIDDEN __attribute__((__visibility__("hidden")))

inline ATTRIBUTE_HIDDEN int xxx (){
   return 5;
}
inline int yyy(){
   return 6;
}

对我来说,如果现在有另一个共享库 D.so 链接到它,那么 D.so 将能够从仅标头的库 C 调用 xxx() 和 yyy() 方法,但是如果我们使用

 构建 D.so -fvisibility=hidden
标志比另一个共享库 E.so 链接到 D.so 而不是在 E.so 内部,因此我们只能调用 yyy() 而不能调用 xxx(),因为后面的函数标记为隐藏。我的理解正确还是我在这里遗漏了一些东西。

c++ visibility
1个回答
0
投票

您对 .so 文件可见性的基本理解是正确的。这就是为什么我对你的困惑感到有点惊讶。根据定义,仅标头库没有 .so 文件,这就是为什么可见性根本不重要的原因。仅头文件库由编译器使用。任何 .cpp 文件(包括仅标头库)都可以调用这些库函数。

© www.soinside.com 2019 - 2024. All rights reserved.