gpt4 book ai didi

C++ 链接器问题

转载 作者:行者123 更新时间:2023-11-30 02:12:31 25 4
gpt4 key购买 nike

我有这个:

a.cpp

int localfunction () { return 1; }
int local_symbol = localfunction();

b.cpp

void thirdfunction () {};

主要.cpp

void main () { thirdfunction (); }

当我在主可执行文件中编译它时,一切正常(即使进行了优化),并且 localfunction 会在启动时执行,即使我不直接调用它也是如此。

现在,在 Visual C++ 和 GCC 中,我将 a.cpp 和 b.cpp 放在静态库 (.lib) 中。 localfunction 不再被执行/定义。

据我了解,该符号被检测为“未使用”并被删除。但这听起来很奇怪,因为:

  • Why it is not removed when I don't use the .lib file?
  • Since the lib is linked in, why the linker blows away the initialization code?

我想做的是在我使用的每个 .lib 文件中有一组启动函数,自动注册一些数据。主可执行文件不应该知道链接了哪些文件,也不应该明确引用“localfunction”(/INCLUDE 确实有效,但不是最佳的)

顺便说一句:使用各种 VC++ 选项(OPT:NOREF 等)不能解决问题。

谢谢!Qb进程

最佳答案

静态库基本上是从该库的组成源文件编译的目标文件的库或存档。

当链接器在构建应用程序时使用静态库来解析依赖项时,它会遵循在库中查找目标文件的过程,以帮助它解析程序中任何 undefined symbol 。它不会自动包含库中的所有目标文件。

在您的实例中,从 main.cpp 生成的目标文件引用 third_function()。这种依赖性可以通过链接到从 b.cpp 生成的目标文件来解决。此目标文件不再引入 undefined symbol ,因此链接器可以(并且确实)在此处停止。

哦,为了最大的可移植性,main 应该返回 int

关于C++ 链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624403/

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