gpt4 book ai didi

c++ - 如何嵌入静态库的拷贝?

转载 作者:行者123 更新时间:2023-12-04 15:16:58 24 4
gpt4 key购买 nike

这是我的解决方案的结构:

enter image description here
A.lib定义:

int a(void) { return 1; }
B.lib定义:
int b(void) { return a(); }
C.lib定义:
int c(void) { return a() * 2; }
SharedStaticLibsTest.exe定义:
int main(void) { std::cout << b() + c() << std::endl; return 0;}

我决定检查(通过 DumpBin )嵌入到结果应用程序中的代码。原来 BC库使用 A 的唯一实例图书馆。有没有办法(出于教育目的)使用 A 的两个不同实例内 BC ?也许这些东西有特定的链接器选项?我知道,这种行为可能会产生意想不到的副作用,这取决于 A 的逻辑。图书馆。

附言我通过在项目的属性中直接包含 .lib 文件来替换对项目的引用。现在 B , C项目有一份 A项目。但最终项目仍然只有 A 的唯一拷贝。图书馆。我不知道链接器如何解决这个问题。

最佳答案

首先,如果你最终得到两个 A 实例在构建中,所有从 A 导出的标识符需要关注One-Definition-Rule .

也就是说,即使您在技术上可以拥有 A 的两个不同版本。 ,除非它们的所有意图和目的都相同,否则您的程序是无效的,编译器和链接器都没有义务告诉您(C++ 标准称之为格式错误,无需诊断)。实际上,这意味着您的程序中会有非常奇怪的错误,并且不知道它们来自哪里。

话虽如此,从技术上讲,没有什么能阻止您构建您所要求的情况。通常静态依赖只在链接阶段被处理。所以一个静态库 B依赖于另一个静态库 A不会导致一个从另一个导出符号 - B将不包含来自 A 的任何符号.

相反,您的构建系统将跟踪该依赖项,并且一旦您到达链接器阶段(例如,通过构建依赖于 B 的可执行文件),构建系统将注意两个库都已链接。这也意味着如果您没有构建系统,或者您的构建配置不正确,您将收到链接器错误,因为它缺少来自 A 的符号。图书馆,即使您链接到 BC明确地。

所以复制符号的规范的、可移植的方式需要通过动态库将它们拉入,因为它们通过链接器。如果您更改 BC要成为动态库,它们都将链接到 A并包含来自 A 的所用函数的独立版本.如果您更改了 A建筑物之间BC ,它们将包含不同的定义。希望您的构建系统会尝试防止这种情况发生。
请注意,C++ 标准没有太多关于动态库的说明,因此有关如何在此处解析符号以及重复符号的影响的技术细节,请参阅您的操作系统手册。

使用 MSVC,还可以为静态库执行此操作。在 B 的项目属性中或 C , 前往 Librarian -> General 并将 Link Library Dependencies 选项设置为 Yes .现在,如果您重建并查看 B.lib 的转储文件和 C.lib同样,它们应该包含来自 A 的符号。以及。当然,在构建生成的可执行文件时,链接器将选择来自 B 的版本。或来自 C (或也直接来自 A,取决于您的链接方式)每个 A正在使用的符号。请不要在生产中这样做。

关于c++ - 如何嵌入静态库的拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com