如何隐藏 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
有 int add(int, int)
只需添加 2 个给定的整数。 B
有 int addb(int, int)
从 A
调用 add
。
C
有 int add(int, int)
乘以 2 个给定的整数。
D
有 void 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
),但现在我有两个问题:
- 乘以
add
的定义(首先在 A
中定义)
no .eh_frame_hdr table will be created
此外,我尝试使用 cmake 制作 A
和 C
SHARED
,但它像以前一样从 C
调用 add
。
我除外,B 将是 "full" 静态库,没有 *UND*
,如果我调用 addb
,它将从 A
调用 add
, add
将从 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 类型和枚举。
我会调整情况的。 在这个问题中,我将 Ubuntu 16.04 与 GCC 6.5.0 和 CMake 3.13.2 一起使用。
我有 4 个静态库和一个可执行文件:A
、B
、C
、D
和 main
。
A
有 int add(int, int)
只需添加 2 个给定的整数。 B
有 int addb(int, int)
从 A
调用 add
。
C
有 int add(int, int)
乘以 2 个给定的整数。
D
有 void 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
),但现在我有两个问题:
- 乘以
add
的定义(首先在A
中定义) no .eh_frame_hdr table will be created
此外,我尝试使用 cmake 制作 A
和 C
SHARED
,但它像以前一样从 C
调用 add
。
我除外,B 将是 "full" 静态库,没有 *UND*
,如果我调用 addb
,它将从 A
调用 add
, add
将从 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 类型和枚举。