C应用程序中的两个主要功能

时间:2016-09-07 21:02:25

标签: c makefile build

我真的投入了一个大项目。我理解代码的第一步是搜索main函数,以便了解架构。

我发现有一个以上的主要功能。确实,它们位于不同的文件夹中,但我不了解此应用程序如何成功构建。我所知道的是链接器需要一个main函数(入口点)。

我认为理解应用程序的构建过程太难了,所以我要问,因为你们当中有些人遇到过这个问题。

1 - 我是否应该有理论背景来理解这一点?如果是这样,请向我推荐文章,书籍,你想要什么。

2 - 当时,我们必须在一个应用程序中使用多个main函数?

3 个答案:

答案 0 :(得分:5)

单个可执行文件不能有多个main函数。有几种可能性。

如果构建只构建一个应用程序,那么将只编译一个main函数。 (或者没有,如果有一个选项来构建库而不是可执行文件。)可能有一些选项可以确定构建哪个库,具体取决于您想要的应用程序的哪个版本,目标系统或其他内容。

或者应用程序可能包含多个可执行文件,每个可执行文件都有一个main函数。

如果运行构建不需要太长时间,我用来确定实际编译的几个源文件中的哪一个的技巧是暂时添加#error指令,例如:

#error "TEMPORARY: This is /full/path/to/source.cpp"

生成的错误消息将告诉您实际编译了哪个源文件。 (如果编译器支持它们,也可以使用#warning指令。)

答案 1 :(得分:0)

  

我是否应该有理论背景来解决这个问题,建议我预订一些你想要的东西

您需要了解构建的含义,但更重要的是,您必须了解特定环境中的构建过程。你需要了解:

  1. 构建目标列表(可执行文件和共享库)
  2. 他们使用的编译器设置(您可以为VS 2010以及VS 2012构建DLL)。
  3.   

    我们什么时候必须在一个应用程序中使用几个主要功能?

    1. 当您的构建系统构建多个可执行文件时,您将需要多个main函数。

    2. 当您的构建系统根据某些设置选择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链接器投诉