一、多目标文件的链接
现在我们将例12.1 用堆栈实现倒序打印拆成两个程序文件,stack.c实现堆栈,而main.c使用堆栈:
//stack.c
char stack[512];
int top=-1;
void push(char c){
stack[++top]=c;
}
char pop(void){
return stack[top--];
}
int is_empty(void){
return top==-1;
}
注意这里堆栈的top总是指向堆栈元素,初始化为-1表示空堆栈。
//main.c
#include<stdio.h>
int a,b=1;
int main(void){
push('a');
push('b');
push('c');
while(!is_empty())
putchar(pop());
putchar('\n');
return 0;
}
a和b变量没有用,只是为了顺便说明链接过程才加上的。编译的步骤和以前一样,可以一步编译:
gcc main.c stack.c -o main
也可以分多步编译:
gcc -c main.c
gcc -c stack.c
gcc main.o stack.o -o main
如果按照第二节 main函数和启动例程中的做法用nm命令查看目标文件的符号表,会发现main.o中有未定义的符号push、pop、is_empty、putchar,前三个符号在stack.o中实现了,链接生成可执行文件main时可以做符号解析,而putchar是libc的库函数,在可执行文件main中仍然是未定义的,要在程序运行时做动态链接。