gpt4 book ai didi

c - 构建静态库时是否解析了 .o 文件之间的引用?

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

例如,假设我构建了一个库 a.lib,它有两个文件:foo.c 和 bar.c。 foo.c 调用 bar.c 中定义的函数 void bar()

现在假设我要创建一个可执行文件,其中包含两个文件:main.c 和 bar.c。此 bar.c 还定义了 void bar(),但实现不同。

当我将可执行文件与 a.lib 链接时,可执行文件将调用哪个 void bar()

最佳答案

让我们假设:

  1. 图书馆是 libfoobar.a (或 libfoobar.lib )并且位于目录 ./lib 中.
  2. 库文件 foo.c定义foo()foo()来电 bar() .
  3. 库文件 bar.c定义bar() .
  4. 库源文件不在当前目录中。
  5. 程序文件bar.c还定义 bar() - 不同的实现。
  6. 程序文件main.c调用 foo()bar() .
  7. 您的链接命令行如下所示:

    cc -o program main.o bar.o -L ./lib -lfoobar

然后:

  • 该程序将包含 bar()来自程序文件bar.c (因为它已明确包含在命令行中,位于库之前)。
  • 该程序将包含 foo()来自库文件foo.c ,但是bar()它调用的将是程序文件 bar.c 中的文件,不是图书馆的。

如果涉及的符号较多,则库foo.c调用仅在库中可用的函数 bar.c (程序 bar.c 没有实现所有这些功能),那么链接将失败,因为该程序包含程序的 bar.c (无条件),但它还需要图书馆的bar.c ,但这给了你函数 bar() 的双重定义——这是一个错误。

曲折可能会变得严重。简单的经验法则——不要这样做。也就是说,不要将程序的 bar.c提供在库的 bar.c 中也可用的符号。如果您必须这样做并且还涉及其他切入点,那么您必须更加努力。

不要将库放在目标文件之前;那么你会失败 bar()双重定义。库在链接列表中查找目标文件。不过,您确实需要以正确的顺序获取多个(静态)库。或者使用特殊选项让加载器重新扫描库等。

关于c - 构建静态库时是否解析了 .o 文件之间的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553077/

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