查看: 440|回复: 2

[C/C++] 【讨论】编译器如何指定main函数

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2023-7-28 19:10:57 | 显示全部楼层 |阅读模式
如题,在一些著名项目里,main函数不叫main函数

有一些叫do_main(int,char **),pmain(Lua_State *),funMain(int,char**),winmain(void)
等等
那么在编译的时候是如何指定这些函数为main函数的呢?(要知道如果不指定是会报错找不到main函数的)
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6867
人气
208
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2023-7-29 08:41:11 | 显示全部楼层
编辑
论坛事务联系邮箱 henry217@x64bbs.cn

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2023-7-29 10:49:07 | 显示全部楼层
GPT-4 生成:

在 C++ 或 C 等语言中,main 函数是程序的入口点。但在某些情况下,我们可能会看到其他名字的函数作为入口点,例如你提到的 do_main, pmain, funMain, winmain 等。这是如何实现的呢?

实际上,这并不是通过指定函数名为 "main" 来实现的,而是通过链接器(linker)设置入口点。链接器是在编译过程的最后一步负责将所有的对象文件和库连接(或链接)在一起,形成一个可执行文件。

具体来说,通常有以下几种方法来实现:

1. 通过命令行参数:在编译时,可以向编译器或链接器传递参数,指定程序的入口点。例如,在 GCC 编译器中,你可以使用 `-e` 选项来指定入口点。这样,就可以设置一个名为 "do_main" 或 "funMain" 的函数作为程序的入口点。例如,`gcc -e do_main your_file.c`。

2. 在源代码中定义:在一些特殊情况下(例如 Windows 中的 WinMain 函数),可以在源代码中定义一个特殊的函数作为程序的入口点。这通常需要配合使用特定的编译器或库。例如,当使用 Win32 API 来编写 Windows 应用程序时,可以使用 WinMain 作为入口点。

3. 通过启动文件:在某些情况下,程序的入口点可能被设置在启动文件(startup file)中。启动文件是一个包含初始化代码的特殊对象文件,通常由编译器自动包含在程序中。在这个文件中,通常会定义一个名为 "_start" 或类似的函数,作为程序的实际入口点。然后,这个函数会调用 "main" 函数,或者你自定义的其他函数。

4. 脚本语言的情况稍有不同。例如,你提到的 Lua 中的 "pmain" 函数,它其实是 Lua 解释器的一个函数,不是用户编写的程序的入口点。当 Lua 解释器启动时,它会调用 "pmain" 函数,然后 "pmain" 函数会调用 Lua 脚本。

因此,对于你的问题,“如何在编译的时候指定这些函数为 main 函数”,答案是:这是通过链接器设置的,可以通过命令行参数、源代码定义或者启动文件来实现。这并不是通过简单地改变函数名来实现的。
Just do it.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表