静态库链接了两次

dar*_*ari 6 c++

我有以下设置:

  1. 一个静态库
  2. 链接到(1.)的动态库
  3. 链接到(1.)和(2.)的可执行文件

来自静态库的代码现在被复制并存在于动态库和可执行文件中.

问题:

Data(全局变量,静态类成员)是否也重复并且可执行文件和dll是否看到相同的数据?

Linux和Windows之间有区别吗?

你怎么解决这个问题?

编辑:

谢谢你的答案,我无法解释我的案件究竟发生了什么.

静态库没有导出/导入标志.动态库帽子导出自己的符号.

视窗:

动态库有一个静态库的文本+数据段的副本.可执行程序无法知道动态库已链接静态库,因为静态库符号中没有可从外部看到.

Linux的:

动态库具有静态库的文本数据段的副本.动态库虽然包含了静态库中自己的符号表中的所有符号(文本和数据). - >可执行文件看到,动态库已经定义了静态库的所有符号,并且没有重新定义它们.

这很糟糕,因为您通常希望在Linux和Windows上具有相同的行为.

  1. 共享符号(默认在linux上)

    • 将静态库中的所有符号链接到共享库时,请对其添加dll导出命令. __attribute__ ((dllexport))
    • 将静态库链接到可执行文件时添加dll import命令. __attribute__ ((dllimport))
    • 代码和数据仅驻留在共享库中,并且可以从外部链接
  2. Reduntant符号(默认在Windows上)

    • 您需要确保静态库的符号不包含在共享库的符号表中
    • __attribute__ ((visibility ("hidden"))) 在gcc上
    • 链接可执行文件时,无法在任何地方找到静态库中的符号,因此会再次包含它们.

pqn*_*net 7

据我所知,这取决于操作系统(因为C++语言并没有说明库应该如何工作).

在Windows上,你将获得两倍的代码和数据,更糟糕的是,在该库中声明的全局变量的两倍(!)

当使用它静态链接程序和库中的标准库时会出现此问题,当您获得两个默认分配器并且如果调用new库而delete另一个时,对象将在new侧面泄漏并且堆可能会在delete一边变得腐败.

我不知道有关其他操作系统的详细信息,但我预计可能会出现类似的问题