我有以下设置:静态库链接两次
- 静态库
- 链接到链接到(1)(1)
- 的可执行文件和动态库( 2.)
来自静态库的代码现在被复制并存在于动态库和可执行文件中。
问题:
是数据(全局变量,静态类成员)也复制并执行可执行文件和DLL看到相同的数据?
Linux和Windows之间有区别吗?
你会如何解决这个问题?
编辑:
感谢您的答案,我无法解释我的情况下发生的事情完全一样。
静态库没有导出/导入标志。 动态库帽子导出自己的符号。
的Windows:
动态库有静态库的文本+数据segement的副本。 可执行程序无法知道动态库是否链接了静态库,因为静态库符号的非外部可见。
的Linux:
动态库有静态库的文本数据segement的副本。 虽然动态库包含静态库中的所有符号(文本和数据),但它们在其自己的符号表中。 - >可执行文件看到,动态库已经定义了静态库的所有符号,并且没有重新定义它们。
这很糟糕,因为您通常需要在Linux和Windows上使用相同的行为。
分享符号(在Linux默认)
- 上所有的符号连接起来,共享库时,添加DLL导出命令,从静态库。
__attribute__ ((dllexport))
- 将静态库链接到可执行文件时添加一个dll导入命令。
__attribute__ ((dllimport))
- 的代码和数据只存在于共享库,并从外面
- 上所有的符号连接起来,共享库时,添加DLL导出命令,从静态库。
Reduntant符号可链接(在Windows默认)
- 你需要确保的符号静态库不包含在共享库的符号表中
__attribute__ ((visibility ("hidden")))
on gcc- 当链接可执行文件时,来自静态li brary不能在任何地方找到,所以他们再次被包括在内。
是的,数据是重复的。你可以通过使用动态库来解决它。 – UmNyobe
@UmNyobe:已经有一个DLL;创造另一个将是没有帮助的,因为它不会与第一个共享全球数据。 –
库是否预编译或可用作源代码? –