c++-C++ 编译器怎么找到main

问题描述

C++ 编译器怎么找到main

一个程序里面有很多头文件h和源文件cpp,
然后程序运行时候必须从main函数开始运行,
但是编译时候编译器是怎么找到main函数呢,
编译器怎么知道main函数在哪个文件里呢

解决方案

每个 obj,lib ,文件里面 都有各种符号信息,特别是重定位表。
如果一个文件没有定义 main
那么他的表里要么指出需要一个main
要么没有任何main函数的信息。

实际上,系统库的某个部分。需要调用 main函数,
所以它会指出这是个外部函数,不在本模块定义,
需要有一个模块定义了它

而你的程序中的某个cpp定义了main
编译后,这个模块的表里会告诉连接器,这里定义了main 这个函数。
连接器,会汇总所有模块的信息,找到定义main的模块。
从而链接上main这个函数,用main的地址替代
call _main 指令生成的二进制代码的地址部分,完成链接。

解决方案二:

看了一楼的说法,貌似没有很清楚,需要看什么书请告诉我/

时间: 2025-01-30 13:52:10

c++-C++ 编译器怎么找到main的相关文章

class-[java]关于main函数的执行先后顺序

问题描述 [java]关于main函数的执行先后顺序 在这个文件在执行的时候先执行那个呢?,如果把InvolveMain类里的方法写成注释后面的又先执行哪个呢?求详细解释一下,谢谢谢谢. package exercise5;//整个文件的类名是E20//创建一个使用可变参数列表而不是普通的main()语法的main().//打印所产生的args数组的所有元素,并用各种不同数量的命令行参数来测试它class InvolveMain{ static void main(String...args){

C#中Property和Attribute的区别实例详解

  本文实例分析了C#中Property和Attribute的区别.分享给大家供大家参考.具体分析如下: 在C#中有两个属性,分别为Property和Attribute,两个的中文意思都有特性.属性之间,但是用法上却不一样,为了区别,本文暂把Property称为特性,把Attribute称为属性. Attribute才是本文的主角,把它称为属性我觉得很恰当.属性的意思就是附属于某种事物上的,用来说明这个事物的各种特征的一种描述.而Attribute就是干这事的.它允许你将信息与你定义的C#类型相

利用javax.tools动态编译执行java代码

inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ). 参考:使用 javax.tools 创建动态应用程序   javax.tools 包是一种添加到 Java SE 6 的标准 API,可以实现 Java 源代码编译,使您能够添加动态功能来扩展静态应用程序.本文将探查javax.tools包中提供的主要类,以Java表达式表示计算一个数值函数y=x*x+x.更多详情请参考<使用 javax.tools 创建动态应用程序>和jav

开发一个Linux调试器(八):堆栈展开

有时你需要知道的最重要的信息是什么,你当前的程序状态是如何到达那里的.有一个 backtrace 命令,它给你提供了程序当前的函数调用链.这篇文章将向你展示如何在 x86_64 上实现堆栈展开以生成这样的回溯. 系列索引 这些链接将会随着其他帖子的发布而上线. 准备环境 断点 寄存器和内存 ELF 和 DWARF 源码和信号 源码级逐步执行 源码级断点 堆栈展开 读取变量 之后步骤 用下面的程序作为例子: void a() {      //stopped here  }  void b() {

JVM学习(1)——通过实例总结Java虚拟机的运行机制

JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms 逃逸分析(DoEscapeAnalysis )的概念--JVM栈上分配实验 JVM中client模式(-client)和server模式(-server)的区别 查看GC日志的方法 使用idea对JVM进行参数输入 Java栈,Java堆和方法区的交互原理 为了能让递归方法调用的次数更多一些,应该怎么做?   当今--截止本文总结之前,使用最为广泛的 JVM 为 HotSpot(HotSp

CMake初步(2)

转自:<你所不知的OSG>第一章:CMake初步(2) http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229&fromuid=3434   1.4 词法和语法 在开始本节的学习之前,我们先总结一下之前所了解到的CMake基本词法和命令. CMake命令通常使用如下的格式: COMMAND( ARG1 ARG2 - ) 复制代码 命令关键字之后使用括号来包含所有的参数:各个参数之间使用空格或者换行符分隔:而参数通常有以

淘宝开源数据库OceanBase编译、安装和配置手册

概述     OceanBase是 一个高性能的分布式表格系统,提供类似BigTable的性能和扩展性,但表格中保存的是强类型的数据,比如integer,string,datetime等. 它使用C++编写,运行于64位Linux环境下.生产环境下需要使用多台机器搭建OceanBase集群以提供高可用和高性能,但是你也完全可以使用一 台机器运行OceanBase.     本章节讲解如何迅速搭建一个可用的最小OceanBase环境,在这之前请确保你能提供以下的条件: 64位的Linux服务器一台

一些关于Java的琐碎知识点

1.对于类中的final类型属性,一般在声明的时候直接写final int a =1: 但也可以在构造函数中进行赋值,如: final int a; A{}( a =1;) 但要注意:需要每一个构造函数都赋值,且不能嵌套. 而如果想写static final int a:则必须在声明时进行初始化,static final int a = 1:因为静态的也是不属于类. 2.继承中要注意的问题:子类对父类中构造方法的问题. 父类的中构造方法不能被继承,故 class A{} class B exte

[CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自System.Object class Employee { ..... } //显示派生子 System.Object class Employee : System.Object { ..... } 由于所有类型最终都是从System.Object派生的,所以可以保证每个类型的每个对象都有一组最基本