如何在 c++ 静态库中隐藏符号?
How to hide symbols in c++ static library?
我会调整情况。 在这个问题上,我使用Ubuntu 16.04与GCC 6.5.0和CMake 3.13.2。
我有 4 个静态库和一个可执行文件:A
、B
、C
、D
和main
。A
有只添加 2 个给定整数的int add(int, int)
。B
有int addb(int, int)
只是从A
打电话给add
.C
有乘以 2 个给定整数的int add(int, int)
。D
有void print()
,从B
调用addb
,从C
调用add
。main
只是打电话给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制作A
和C
SHARED
,但它像以前一样从C
调用add
。
我排除了 B 将是"完整"静态库,没有*UND*
,如果我调用addb
它将从A
调用add
,add
将从C
调用。 谢谢!
您违反了一个定义规则。简而言之,每个函数(1)只能定义一次(除非声明为内联,在这种情况下,所有定义都必须相同)。
您正在尝试执行的操作是习惯性地使用命名空间完成的。您的 A、B、C 库将在适当的命名空间中声明其所有函数。
类似的东西
namespace A
{
int add(int lhs, int rhs);
};
namespace C
{
int add(int lhs, int rhs);
}
(1)一个定义规则不仅与功能有关。在程序级别,它也适用于变量,并且在给定的翻译单元中,这也扩展到模板、类类型和枚举。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- dynamic_cast什么时候会因为隐藏符号而失败?
- 隐藏共享库中的"_init"和"_fini"符号
- 为什么隐藏的符号仍然添加到 DSO 中
- 如何在 c++ 静态库中隐藏符号?
- 静态库将转换为共享的lib符号隐藏
- C++隐藏的符号链接
- g++ - 虚拟方法在生成的二进制中创建符号,我无法隐藏
- 将静态库链接到共享库并隐藏导出的符号
- 如果我将某些符号用作 STL 容器的元素,为什么我无法隐藏它的名称?
- 静态地将私有库链接到公共库以隐藏符号
- /usr/lib/libc_nonshared.a(fstat64.oS) 中的 ld 隐藏符号'fstat64'被 DSO 引用
- C++ Win32 从编辑框中隐藏(禁用)插入符号
- c++隐藏符号增加重定位时间
- 用于在c++中隐藏符号的LD脚本
- 在richit winapi中隐藏插入符号
- 这段代码是如何向链接器隐藏符号的
- Gcc隐藏了来自包含的静态库的符号的可见性