我们什么时候使用gcc -u编译器选项? 你能提供一个例子吗?
https://gcc.gnu.org/onlinedocs/gcc-2.95.2/gcc_2.html 说如下:
假设符号符号未定义,强制链接库 模块来定义它。你可以使用`-u'多次不同 用于强制加载其他库模块的符号。
答案 0 :(得分:2)
通常在链接对象期间,将在提供的模块(即,来自编译的归档文件和其他目标文件)中搜索 undefined 符号,并且仅使用最小满足整个集合所需的符号从提供的模块中提取了未定义的符号。
实际上,这意味着如果您有目标文件中的函数foo(),除非foo()在最终链接产品中的其他位置使用,否则它将不包括在内。这通常是期望的行为。
如果您的模块提供了一些功能,而这些功能在最终链接的产品中没有被其他地方引用,却又希望包含这些功能,那该怎么办? (例如,也许这些功能被设计为直接从调试器调用)。这是-u
选项派上用场的地方。它有效地告诉链接器,对foo()的引用不令人满意,因此尽管没有在代码中引用该符号,也会触发将其包含到最终链接的乘积中。
foo.h:
void foo(void);
foo.c:
void foo(void) { }
bar.h:
void bar(void);
bar.c:
void bar(void) { }
main.c:
#include "foo.h"
#include "bar.h"
int main(int argc, char** argv) {
foo();
return 0;
}
内部版本:
gcc -c foo.c bar.c main.c
ar -r libfoo.a foo.o
ar -r libbar.a bar.o
# For macOS, replace -shared with -dylib
ld -shared main.o -L . -lfoo -lbar
nm -g --defined-only a.out
> T _main
> T _foo
# For macOS, replace -shared with -dylib
ld -shared -u _bar main.o -L . -lfoo -lbar
nm -g --defined-only a.out
> T _main
> T _foo
> T _bar