03.07 c/c++运行时dll在不知道main函数的情况下是怎样编译成功的?

岩石龙


首先,你是不是想说调用dll? 调用过程是运行时发生的,编译时不验证这个,因此编译成功没什么问题。但是,尽管你可以编译成功,但运行的时候还是有可能报出缺少dll的异常…


成都茂大叔


首先明确main函数是什么:main函数是程序入口,程序从这里开始运行。

然后再来明确2个东西:可执行文件exe和动态链接库dll。(dll在windows环境下是动态链接库,exe在windows环境下是可执行文件)

什么是可执行文件?可执行文件就是编译好后,生成的文件可以运行某种功能。你双击exe文件会运行一定的功能(比如弹出窗口之类的),而这个功能就是从main函数开始运行的,因为main函数是程序入口,即程序从这里开始运行。

什么是动态链接库?动态链接库是封装好的,能实现一类功能的独立函数包,可以把dll看做是写好的c++函数,只是后缀名从cpp变成了dll(实际上编译器还会优化代码),且dll是被调用的,不能主动运行。即你双击dll文件不会运行,所以它不需要main函数。

你在配置工程的时候会选择输出是可执行文件或者动态链接库,编译器知道dll是没有main函数的,所以编译器就能编译成功。


遛电子的老李


动态库与main无关系。

你问题涉及到动态库的两个方面。

一是运行时,既程序运行过程,这个过程main函数由系统来执行,动态库则分为动态加载和静态加载两种,静态加载由系统负责查找和加载,动态加载由你的可执行程序或者另外动态库通过系统接口加载给定动态库,所以运行时动态库与main函数无关。

二是编译时,既动态库生成过程,该过程只需要能够找到动态库中用到的接口即可,而且不能够是main接口(main只能由系统运行),所以动态库编译时也无main函数无关。


小乐爸爸


你的这个问题首先有个错误要纠正:C/C++程序能够运行起来,必须要先编译,只有编译成功了才有可能运行起来,如果没有入口函数main,程序也是运行不起来的。dll在windows下是属于动态库,他是不能单独运行的,必须要有带有main函数的程序来调用才能够发挥本身动态库封装的功能。


一粒尘土一个世界


exe是以main函数为入口编译优化。dll是以导出函数为入口编译优化。看起来exe像是只有一个名称为main的导出函数的dll,其实exe也可以导出其他函数,两者没有本质区别。


无尽的代码


编译dll文件是不需要文件里有main函数的,dll文件编译后,可作为一个可执行模块,被其他程序调用。


公考一卒


应用程序从main开始执行,按名称或编号引用dll中的函数,第一次调用时建立链接:装载动态库,确定函数地址,替代调用点的被调用地址。


ScholarMartin


我去,可以模拟一个空的main函数啊


羊羊羊146777668


main函数只是程序的运行入口函数 跟编译有啥关系


分享到:


相關文章: