您的位置:首页 > 编程语言

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

2013-10-12 13:01 141 查看
实例程序如下:
//  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++语言的修饰规则。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐