编译/链接过程如何工作?)关于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
[编辑]附加上下文
这个问题出现在嵌入式环境中,人们在使用共享库还是静态库之间进行了争论。在钻石内含物的情况下,我们担心系统上的二进制文件大小会无用地增加,并且想要一个比“在某些设备上尝试它,希望它在任何地方都是相同的行为”更通用的答案。
如果您的所有库都是静态或全部动态,您可能不会有问题。
但是,如果您有一个依赖于静态库的动态库,则该静态库将链接到动态库中。如果另一个动态库需要相同的静态库,它也会获得一个副本。并且该应用程序将获得自己的副本。
就我而言,我们在静态库中有单例,它们使用静态变量来确保单一性。由于库有多个副本,变量也有多个副本,单例不再那么单一。混乱随之而来。