[英]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个给定的int。 B
具有int addb(int, int)
,仅从A
调用add
。 C
有int add(int, int)
乘以2给定的int。 D
具有void print()
, addb
从B
调用addb
并从C
add
。 main
只是调用print()
。 所有这些功能将声明和定义分为.cpp
和.hpp
。
方案:
A (add)
|
B (addb) C (add)
| |
|___________|
|
D (print)
|
main
我必须怎么做才能隐藏A
符号中的add
? 因为我在连接main
时从ld获得了乘以定义。
如果我仅使用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
它会调用add
的A
, add
将调用C
。 谢谢!
您违反了一个定义规则 。 简而言之,这就是说每个函数(1)只能定义一次(除非声明为内联,在这种情况下所有定义都必须相同)。
您试图做的事是惯用名称空间完成的。 您的A,B,C库将在适当的名称空间中声明其所有功能。
就像是
namespace A
{
int add(int lhs, int rhs);
};
namespace C
{
int add(int lhs, int rhs);
}
(1)一个定义规则不仅与功能有关。 在程序级别,它也适用于变量,在给定的翻译单元中,它也扩展到模板,类类型和枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.