我真的投入了一个大项目。我理解代码的第一步是搜索main
函数,以便了解架构。
我发现有一个以上的主要功能。确实,它们位于不同的文件夹中,但我不了解此应用程序如何成功构建。我所知道的是链接器需要一个main
函数(入口点)。
我认为理解应用程序的构建过程太难了,所以我要问,因为你们当中有些人遇到过这个问题。
1 - 我是否应该有理论背景来理解这一点?如果是这样,请向我推荐文章,书籍,你想要什么。
2 - 当做时,我们必须在一个应用程序中使用多个main
函数?
答案 0 :(得分:5)
单个可执行文件不能有多个main
函数。有几种可能性。
如果构建只构建一个应用程序,那么将只编译一个main
函数。 (或者没有,如果有一个选项来构建库而不是可执行文件。)可能有一些选项可以确定构建哪个库,具体取决于您想要的应用程序的哪个版本,目标系统或其他内容。
或者应用程序可能包含多个可执行文件,每个可执行文件都有一个main
函数。
如果运行构建不需要太长时间,我用来确定实际编译的几个源文件中的哪一个的技巧是暂时添加#error
指令,例如:
#error "TEMPORARY: This is /full/path/to/source.cpp"
生成的错误消息将告诉您实际编译了哪个源文件。 (如果编译器支持它们,也可以使用#warning
指令。)
答案 1 :(得分:0)
我是否应该有理论背景来解决这个问题,建议我预订一些你想要的东西
您需要了解构建的含义,但更重要的是,您必须了解特定环境中的构建过程。你需要了解:
我们什么时候必须在一个应用程序中使用几个主要功能?
当您的构建系统构建多个可执行文件时,您将需要多个main
函数。
当您的构建系统根据某些设置选择file1.c或file2.c来构建可执行文件时,您可能会在file1.c中找到main
函数以及file2.c。这将是一种组织代码的相当差的方法,但它是可能的。
答案 2 :(得分:0)
尝试将可执行文件与同一标识符的多个定义(在本例中为main
)链接将失败,因为链接器无法选择其中一个。
有一种可能性,但允许您有多个main
入口点,但保证您只在构建过程中选择一个。
我将用一个简单的例子来说明这一点:假设你有一个库(一个.a
静态库),它有一个包含main
定义的模块。由于在链接时根据链接库时标识符的实际需要选择了库模块,因此当您没有模块或模块时,可以在模块中提供main
定义。如果您有正确的定义,则不会链接。这在一些标准库中被利用,例如-ll
(flex具有调用yylex()
函数的main的定义),-ly
(bison有一个调用yyparse()
的主要定义例程)如果您以前没有这些模块,则包含这些模块。
但要注意,就好像你在库-ll
之后链接你的主要功能一样,它将被包含(因为main
在他包含库时没有解决,然后你包括第二个重复的条目,使ld
链接器投诉