二十、链接详解

一、多目标文件的链接

现在我们将例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中仍然是未定义的,要在程序运行时做动态链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值