最近在弄boost test单元测试的时候,遇到了一个运行程序后就闪退掉的问题,找了好久才发现,原来是没有进入到boost 自己的main函数中,因为链接的其他lib中,有一个文件也定义了main函数,编辑器最终是选择了那个main函数作为程序的入口。


在 vs下  main函数 通常是 int _tmain( int argc, _TCHAR* argv[ ] )的形式,这是为了统一unicode与ansi。在ansi下,_tmain会被替换为main。在unicode下,_tmain会被替换为 wmain,这时其实程序中就没有名为main的函数了,我觉得这在非vs环境下,可能会找不到main函数而链接不过的,C/C++中规定的是名为 main的函数是程序入口。

我又试验了下,纵使在vs下,unicode下,你定义了_tmain函数,同时再定义一个main函数,这样也是会进入main函数,而不是_tmain也就是wmain函数的。

总结,也就是,vs下还是会优先寻找名为main的函数,没有的情况下才会去按照_tmain对应的来选择。


另外,说到入口函数main,vs下,如果文件中已经定义了main,而链接的lib中也有main的话,是会链接冲突的,然而,如果文件中未定义main,链接的两个lib中都有main,这时,vs是选择先找到的那个main作为程序入口,而不发出任何错误警告信息。

按 理说,有两个同名同参数的函数,即使在lib里,应该也是要链接冲突的(这句不确定是不是,没验证过),但是对于main函数,因为main函数相当于C 里的应用一样,对于main函数是不可以进行重载的,或许这个原因,反正vs下,多个lib都有时,是选择第一个main的。


再 说下,vs下找lib的顺序,依验证,应该是先查看工程配置里的链接--输入--附加依赖项中的lib,排在前面的即先被找到;然后才是文件中 用#pragma comment(lib, "xxxx.lib")的方式的那些lib,也是跟文件编译链接顺序有关了。所以,要不自己在文件中定义好main,要不如果是用lib中的main的 话,一定要确保那个lib放在工程配置中的最前面。