如果目标文件链接在一起,预期的行为是您的函数将被调用。任何未声明的函数都被假定为一个外部函数,它返回一个用于编译目的的整数,以及一个用于链接目的的外部符号(到目标文件)。我给你举个具体的例子:
foo.c:
void foo(const char *name) {
printf("foo called with %s\n", name);
}
bar.c:
void bar(int a) {
printf("bar called with %d\n", a);
}
main.c:
int main(int argc, char *argv[]) {
foo("Hello");
bar(5);
return 0;
}
使用 gcc 编译目标文件:
gcc -fno-builtin -ansi -c -o foo.o foo.c
gcc -fno-builtin -ansi -c -o bar.o bar.c
gcc -fno-builtin -ansi -c -o main.o main.c
这些不应产生任何警告或错误
现在将它们链接在一起:
gcc -o progy main.o bar.o foo.o
请注意,我使用 gcc 来链接二进制文件,但这相当于:
ld -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o progy /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbegin.o main.o foo.o bar.o -lc -L/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1 -lgcc -lgcc_s /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtend.o /usr/lib64/crtn.o
在我的 Linux 64 位平台上。 (GCC 实际上是这样运行 LD 来进行链接的)
使用您的 C 编译器(在我的情况下为 gcc)进行链接将确保无论您的构建目标平台是什么,都可以正确调用链接器。如果您使用 IDE,那么这些步骤都会被一个漂亮的界面隐藏起来。