关于对象文件在进行连接时的一些思考

来源:互联网 发布:python回调函数传参数 编辑:程序博客网 时间:2024/05/16 08:54

实例程序如下:

//  a.c

//  编译指令:cl /c a.c ----> a.obj

int a;

 

//  b.c

extern int a;

int main()

{

    int b = a;

}

文件 b.c 编译后生成 b.obj 文件   ,extern 关键字表明整型变量(int) e 来自于外部的 .obj 文件或者.lib文件,所以为了正确得到该变量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正确得到 .obj 文件。

以上为 b.obj 的汇编代码注意其中的符号 _e ,在对象文件 b.obj 文件进行连接时就是要根据符号 _e进行查找和定位,从而得到e的值。

 

b.obj文件的汇编代码:

其中产生了符号 _e 所以在连接时a.obj才能正确找到e的值。正确连接后,变量e被分配到数据段,使用b.obj文件中的值进行正确的赋值,此时,变量e就有了确切的地址,符号_e自然就没有用了,所以连接(link a.obj b.obj)后生成的a.exe中就没有了符号_e.

 

变量(e)的修饰名称(_e),是与编译器设置相关的(和语言相关的),倘若变量e声明在a.c文件中,在某个.cpp文件中如若使用到e,则应该使用extern "C" int e来进行说明,这样其生产的obj文件对e的名称修饰就是_e,而不是C++语言的修饰规则。

 

原创粉丝点击