弱属性是否仅适用于Linux GCC中的共享库?

弱属性是否仅适用于Linux GCC中的共享库?,gcc,shared-libraries,weak-linking,Gcc,Shared Libraries,Weak Linking,我是Linux gcc的新手。我正在编写一个简单的代码来学习LinuxGCC中的弱属性 请参见我的示例代码: weakref.c,主文件。我希望该文件可以在定义或不定义foo方法的情况下工作 #include <stdio.h> extern void foo(void) __attribute__((weak)); int main() { if (foo){ foo(); printf ("foo is defined\n"); } else {

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

请参见我的示例代码:

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");
  }
}
输出是“foo未定义”,这是我所期望的

然后,我创建了一个新文件libfoo.c,请参见以下内容:

#include <stdio.h>

void  foo() {
  printf("Print in foo.\n");
}
你能告诉我弱引用是否只适用于共享库,为什么?非常感谢

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

一点也不

都是1。三,。预计将产生“foo已定义”

二,。不希望从
libfoo.a
提取
libfoo.o
,因为从
weakref.o
提取对象时,未解析的弱引用不算作未解析符号。但是,您可以强制将
libfoo.o
拉入链接,如下所示:
gcc weakref.o-lfoo-ufoo
,然后您应该再次获得“foo已定义”

现在我已经说明了应该发生什么,让我们看看实践是否同意。使用
gcc(Ubuntu 4.4.3-4ubuntu5.1)4.4.3
GNU-ld(用于Ubuntu的GNU-Binutils)2.20.1-system.20100303从Linux/x86_64系统获得的转录本:

$ 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:

正如你所看到的#1“像我预期的那样有效,而不是像你声称的那样。你一定是在什么地方出错了

这是你的#2:

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

$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined
谢谢我的1号和2号正在工作。#1失败的原因是我使用ld链接了2个对象文件,而不是gcc。
$ 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
$ gcc weakref.o libfoo.o && ./a.out
Print in foo.
foo is defined
$ gcc weakref.o -L. -lfoo && ./a.out
foo is not defined
$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined