库多重链接和二进制复制?

问题描述 投票:0回答:1
这是一个基本问题(所以可能是重复的,但到目前为止我找不到合适的答案,即使在

编译/链接过程如何工作?)关于C

++中的库链接以及可能的特异性使用 CMake。

当给定库的二进制文件在应用程序的依赖关系图中多次出现(以类似菱形的模式)时,如何管理它?

A

B
 成为两个库,
C
 成为一个应用程序。

A

取决于
B

C

 取决于 
A
 但也直接取决于 
B
B
 的符号在 
C
 代码中提到)

我的问题分解如下

1-

A

 正在暴露来自 
B
 的符号(
B
 的符号在 
A
 界面中提到)

a.没有cmake

如果我用

C

 编译 
-l A -l B
,用 
A
 编译 
-l B
B
 中会有多少个 
C
 二进制文件副本?

A

B
的性质是否会改变答案(根据
A
B
是否动态,从而给出4种可能性)

b.用cmake

同样的问题,但我不是做

-l

,而是做
find_package
,然后是
target_link_libraries

A
B
据说已经正确打包和安装,以便被
find_package
找到)

C

 包括 
A
B
PRIVATE

A

 包括 
B
 作为 
PUBLIC

2-

A

 不暴露 
B

a.没有cmake

如果我用

C

 编译 
-l A -l B
,用 
A
 编译 
-l B
B
 中会有多少个 
C
 二进制文件副本?

A

B
的性质是否会改变答案(根据
A
B
是否动态,从而给出4种可能性)

b.用cmake

同样的问题,但我不是做

-l

,而是做
find_package
,然后是
target_link_libraries

C

 包括 
A
B
PRIVATE

A

 包括 
B
 作为 
PRIVATE

[编辑]附加上下文 这个问题出现在嵌入式环境中,人们在使用共享库还是静态库之间进行了争论。在钻石内含物的情况下,我们担心系统上的二进制文件大小会无用地增加,并且想要一个比“在某些设备上尝试它,希望它在任何地方都是相同的行为”更通用的答案。

c++ cmake linker shared-libraries static-libraries
1个回答
0
投票
你的担心是对的。很多年前,我在 Windows 中曾有过一次糟糕的经历。我不确定您的嵌入式系统是否会以相同的方式工作,但原理可能相似。

如果您的所有库都是静态或全部动态,您可能不会有问题。

但是,如果您有一个依赖于静态库的动态库,则该静态库将链接到动态库中。如果另一个动态库需要相同的静态库,它也会获得一个副本。并且该应用程序将获得自己的副本。

就我而言,我们在静态库中有单例,它们使用静态变量来确保单一性。由于库有多个副本,变量也有多个副本,单例不再那么单一。混乱随之而来。

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