【发布时间】:2015-09-21 11:10:42
【问题描述】:
我有以下设置:
- 静态库
- 链接到 (1.) 的动态库
- 链接到 (1.) 和 (2.) 的可执行文件
来自静态库的代码现在被复制并出现在动态库和可执行文件中。
问题:
数据(全局变量、静态类成员)是否也重复,可执行文件和 dll 是否看到相同的数据?
Linux 和 Windows 有区别吗?
你会怎么解决这个问题?
编辑:
感谢您的回答,我现在可以准确解释我的情况发生了什么。
静态库没有导出/导入标志。 动态库有自己的符号导出。
窗户:
动态库有一个静态库的文本+数据段的副本。 可执行文件无法知道动态库已链接静态库,因为从外部看不到任何静态库符号。
Linux:
动态库拥有静态库的文本数据段的副本,并将静态库中的所有符号(文本和数据)包含在其自己的符号表中。 -> 可执行文件看到,动态库已经定义了静态库的所有符号,并没有重新定义它们。
这很糟糕,因为您通常希望在 linux 和 windows 上具有相同的行为。
- 共享符号(Linux 上的默认设置)
- 在将静态库链接到共享库时,对静态库中的所有符号添加 dll 导出命令。
__attribute__ ((dllexport)) - 在将静态库链接到可执行文件时添加 dll 导入命令。
__attribute__ ((dllimport)) - 代码和数据仅驻留在共享库中,可从外部链接
- 冗余符号(Windows 默认)
- 您需要确保静态库的符号不包含在共享库的符号表中
-
__attribute__ ((visibility ("hidden")))在 gcc 上 - 链接可执行文件时,静态库中的符号无法在任何地方找到,因此会再次包含它们。
【问题讨论】:
-
是的,数据是重复的。您可以通过使用动态库来解决它。
-
@UmNyobe:已经有一个 DLL;创建另一个将无济于事,因为它不会与第一个共享全局数据。
-
这些库是预编译的还是作为源代码提供的?
标签: c++