2

我是 Linux gcc 的新手。我正在编写一个简单的代码来学习 Linux gcc 中的弱属性。

查看我的示例代码:

weakref.c,主文件。我希望文件可以在定义或不定义 foo 方法的情况下工作。

#include <stdio.h>
extern void foo(void) __attribute__((weak));

int main() {
  if (foo){
    foo();
    printf ("foo is defined\n");
  } else {
    printf("foo is not defined\n");
  }
}

所以,我运行以下命令来编译它并运行它:

gcc weakref.c -o main_static
./main_static

并且输出是“foo is not defined”,这是我所期望的。

然后我创建了一个新文件 libfoo.c,见下图:

#include <stdio.h>

void  foo() {
  printf("Print in foo.\n");
}

我尝试了 3 种方法来尝试使主文件与 libfoo.c 一起使用:

  1. 编译 libfoo.c 和 weakref.c 并链接目标文件。
  2. 将libfoo.c编译为静态库,并与weakref.c的目标文件链接
  3. 将libfoo.c编译为共享库,并与weakref.c的目标文件链接

只有第三种方式有效并获得以下输出:

Print in foo.
foo is defined

您能否让我知道弱引用是否仅适用于共享库,为什么?非常感谢!

4

1 回答 1

3

让我知道弱引用是否仅适用于共享库

一点也不。

1. 和 3. 都应该产生“foo is defined”。

2.预计不会libfoo.o从 中拉取libfoo.a,因为从归档库中拉取对象时,未解析的弱引用 fromweakref.o不算作未解析的符号。但是,您可以像这样强制 libfoo.o被拉入链接:gcc weakref.o -lfoo -ufoo,然后您应该再次获得“foo is defined”。

既然我已经说明了应该发生的事情,让我们看看实践是否同意。来自 Linux/x86_64 系统的脚本,使用gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3and GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303

$ gcc -c weakref.c libfoo.c
$ ar ruv libfoo.a libfoo.o
ar: creating libfoo.a
a - libfoo.o
$ gcc weakref.o && ./a.out
foo is not defined

这是你的#1:

$ gcc weakref.o libfoo.o && ./a.out
Print in foo.
foo is defined

如您所见,#1“有效”,正如我所料,而不是您声称的那样。你一定在某个地方犯了一些错误。

这是你的#2:

$ gcc weakref.o -L. -lfoo && ./a.out
foo is not defined

您的 #2 再次,但强制将 libfoo.o 拉入链接:

$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined
于 2012-07-06T20:51:27.017 回答