回 帖 发 新 帖 刷新版面

主题:模块的编译与链接

各位高手好,小弟在看课本上的“模块的编译与链接”这一节时什么也没看明白:怎么将多个文件编译成一个程序呢?怎么将一个文件存为库函数呢?请帮我编写一个很简单的模块的编译与链接的例子好吗?感激不尽!!

回复列表 (共3个回复)

沙发

你的课本上我不信没有例子。
所以,看透课本吧。

板凳

“将一个文件存为一个库函数”是什么意思呢?库函数是指存在函数库里的函数,函数库的存放形式是文件
至于例子,我想lz最好去找个linux下的makefile看看

3 楼

比如我们现在有四个文件: 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。

我来回复

您尚未登录,请登录后再回复。点此登录或注册