主题:模块的编译与链接
yaoyinglong
[专家分:0] 发布于 2010-06-01 00:05:00
各位高手好,小弟在看课本上的“模块的编译与链接”这一节时什么也没看明白:怎么将多个文件编译成一个程序呢?怎么将一个文件存为库函数呢?请帮我编写一个很简单的模块的编译与链接的例子好吗?感激不尽!!
回复列表 (共3个回复)
沙发
3751002 [专家分:160] 发布于 2010-06-05 22:31:00
你的课本上我不信没有例子。
所以,看透课本吧。
板凳
雪光风剑 [专家分:27190] 发布于 2010-06-06 01:22:00
“将一个文件存为一个库函数”是什么意思呢?库函数是指存在函数库里的函数,函数库的存放形式是文件
至于例子,我想lz最好去找个linux下的makefile看看
3 楼
大鹏鸟1海阔天空 [专家分:890] 发布于 2010-06-06 02:18:00
比如我们现在有四个文件: add.c mult.c math.h main.c
math.h 是定义 加,乘两个函数的头文件。
add.c 包含math.h 并实现其中的加法函数。
mult.c 包含math.h 并实现其中的乘法函数。
main.c 包含程序入口函数main(), 并在其中调用了加法,乘法函数。
四个文件内容如下:
math.h ///////////////
#ifndef _MATH_H_
#define _MATH_H
int add (int a, int b);
int mult (int a, int b);
#endif
add.c /////////////
#include "math.h"
int add (int a, int b)
{
return (a + b);
}
mult.c /////////////
#include "math.h"
int mult (int a, int b)
{
return (a * b);
}
main.c ////////////
#include <stdio.h>
#include <math.h>
int main()
{
int a, b;
a = 1;
b = 2;
printf("Add result is : %d\n", add(a, b));
printf("Mult result is : %d\n", mult(a, b));
}
对于这四个文件编译成一个可执行程序的过程如下:
第一步: 预编译
这一步要做的事情就是专门处理文件中以#开头的预编译伪指令,比如add.c中的“#include “math.h””, 就是把math.h的内容完全复制到add.c文件中。
第二步:编译
这一步要做的事情就是把 add.c, mult.c main.c 三个C文件翻译成汇编代码,生成三个文件:add.S mult.S main.S。
第三步:汇编
这一步要做的事情就是把add.S mult.S main.S处理成可重定位的目标文件。生成add.o, mult.o main.o (也可能是add.obj, mult.obj, main.obj).
第四步:连接
这一步就是要把第三步的几个目标文件链接成一个可执行程序。比如main.c中调用了add.c中的加法函数,那么编译的时候就会去链接add.o (add.obj),然后生成一个可执行程序。
以上几步只是对编译过程的一个粗略的介绍,其中还有很多细节,比如语法,语义检查,汇编代码优化等等,需要进一步查阅编译原理方面的书籍,推荐龙书。
至于楼主提到的如何将一个文件存为库函数,我的理解是一个不包含main()函数的文件,里边有好多其它函数的实现,如何将这个文件编译为一个库。如果是这样,就是在编译过程的第三步给编译中添加一些选项,比如Linux系统下gcc编译器添加-fpic -shared等可生成动态链接库。对于向外提供用户自定义的库,必须提供对应的头文件和链接是使用的目标文件,如.so, .a .dll。
我来回复