我会调整情况。 在这个问题中,我将Ubuntu 16.04与GCC 6.5.0和CMake 3.13.2结合使用。
我有4个静态库和一个可执行文件:A
,B
,C
,D
和main
。
A
的{{1}}仅添加2个给定的整数。 int add(int, int)
有B
个刚刚从int addb(int, int)
呼叫add
的地方。
A
的{{1}}乘以2个给定的整数。
C
具有int add(int, int)
,它们从D
调用void print()
,从addb
调用B
。
并且add
仅调用C
。
所有这些功能都将声明和定义分为main
和print()
。
方案:
.cpp
要从.hpp
符号中隐藏A (add)
|
B (addb) C (add)
| |
|___________|
|
D (print)
|
main
,我该怎么做?因为我在链接add
时有ld的乘法定义。
如果我仅使用cmake进行构建,它将在两种情况下从A
调用main
(请参阅add
的{{1}})。我将C
与ld(print()
)链接,但现在有两个问题:
D
的定义(首先在B
中定义)ld -static
我也尝试用cmake制作add
和A
no .eh_frame_hdr table will be created
,但它像以前一样从A
调用C
。
我除外,B将是“完整的”静态库,没有SHARED
,如果我调用add
,它将从C
,{{1} }将从*UND*
进行呼叫。
谢谢!
答案 0 :(得分:0)
您违反了一个definition rule。简而言之,这就是每个函数(1)只能定义一次(除非声明为内联,在这种情况下所有定义都必须相同)。
您试图做的是习惯上使用名称空间。您的A,B,C库将在适当的名称空间中声明其所有功能。
类似
namespace A
{
int add(int lhs, int rhs);
};
namespace C
{
int add(int lhs, int rhs);
}
(1)一个定义规则不仅与功能有关。在程序级别,它也适用于变量,在给定的翻译单元中,它也扩展到模板,类类型和枚举。