Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在构建静态库时,跨.o文件的引用是否已解析?_C_Linker - Fatal编程技术网

C 在构建静态库时,跨.o文件的引用是否已解析?

C 在构建静态库时,跨.o文件的引用是否已解析?,c,linker,C,Linker,例如,假设我构建了一个库a.lib,它有两个文件:foo.c和bar.c。foo.c调用bar.c中定义的函数void bar() 现在假设我有一个我将要创建的可执行文件,它有两个文件:main.c和bar.c。此bar.c还定义了void bar(),但使用了不同的实现 当我将可执行文件与a.lib链接时,可执行文件将调用哪个void bar() 该库是libfoobar.a(或libfoobar.lib),位于目录/lib 库文件foo.c定义foo()和foo()调用bar() 库文件ba

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

现在假设我有一个我将要创建的可执行文件,它有两个文件:main.c和bar.c。此bar.c还定义了
void bar()
,但使用了不同的实现

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

  • 该库是
    libfoobar.a
    (或
    libfoobar.lib
    ),位于目录
    /lib
  • 库文件
    foo.c
    定义
    foo()
    foo()
    调用
    bar()
  • 库文件
    bar.c
    定义
    bar()
  • 库源文件不在当前目录中
  • 程序文件
    bar.c
    还定义了
    bar()
    ——一种不同的实现
  • 程序文件
    main.c
    调用
    foo()
    bar()
  • 您的链接命令行如下所示:

    cc -o program main.o bar.o -L ./lib -lfoobar
    
  • 然后:

    • 程序将包含程序文件
      bar.c
      中的
      bar()
      (因为它已明确包含在命令行中,位于库之前)
    • 程序将包含库文件
      foo.c
      中的
      foo()
      ,但它调用的
      bar()
      将是程序文件
      bar.c
      中的,而不是库中的
    如果涉及更多符号,因此库
    foo.c
    调用的函数仅在库
    bar.c
    中可用(程序
    bar.c
    不实现所有这些函数),则链接将失败,因为程序包含程序的
    bar.c
    (无条件),但它也需要库的
    bar.c
    ,但这给了函数
    bar()
    ”的双重定义,这是一个错误

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


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

    请发布您的代码和尝试执行的操作