我是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未定义”,这正是我所期望的。
然后我创建了一个新文件libfoo.c,见下文:
#include <stdio.h>
void foo() {
printf("Print in foo.\n");
}
我尝试了三种方法来尝试使用libfoo.c使主文件工作:
只有第3种方式有效并获得以下输出:
Print in foo.
foo is defined
如果弱参考仅适用于共享库,请告诉我,为什么?非常感谢!
答案 0 :(得分:3)
如果弱参考仅适用于共享库
,请告诉我
完全没有。
预计1.和3.都会生成“foo is defined”。
2. 不期望从libfoo.o
提取libfoo.a
,因为来自weakref.o
的未解析的弱引用不会被视为未解析的符号从归档库中提取对象。但是,您可以将强制 libfoo.o
拉入链接,如下所示:gcc weakref.o -lfoo -ufoo
,然后您应该再次获得“foo is defined”。
现在我说明了应该发生了什么,让我们看看这种做法是否同意。来自Linux / x86_64系统的脚本,使用gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
和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