【问题标题】:Multiple files compilation error in CC中的多个文件编译错误
【发布时间】:2015-07-21 21:01:57
【问题描述】:

我尝试在 Visual Studio 2010 中编译两个源文件(client.c 和 server.c)。

我创建了一个项目并将它们保存在“源文件”文件夹中,但是当我运行时,我收到 main() 已在其他文件中定义的错误。当我删除一个文件(server.c 或 client.c)时,另一个文件会被编译。

我尝试了很多来把事情做好,也尝试了代码块,同样的事情发生了。

【问题讨论】:

  • 看起来您有两个程序(客户端和服务器),因此您需要创建两个项目。但是,您可以将它们放在同一个 VS 工作区(或解决方案或当前版本中的任何名称)中。

标签: c visual-studio-2010 visual-studio main projects-and-solutions


【解决方案1】:

TL;DR -- 一个二进制(程序)可以包含一个main()。多个文件,每个包含main() 应被视为单独的peroject,而不是单个文件。

一个二进制文件只能包含一个main()。这是二进制开始执行的

如果您的两个源文件都具有main() 函数(这很可能),那么您不能将已编译的目标文件链接 到同一个二进制文件中。您必须创建两个单独的二进制文件。您不能链接两个单独的目标文件,它们都定义了main() 的实例。

我对 VS 不是很熟悉,但如果可能的话,您可以寻找一些选项来从两个不同的源文件创建两个单独的二进制文件。

【讨论】:

    【解决方案2】:

    听起来好像是在告诉 Visual Studio 这两个文件应该用于编译单个目标。当您告诉编译器这一点时,项目中的一个且只有一个文件必须具有main 函数。

    您需要定义两个单独的目标。老实说,我不使用 VS 来处理这类事情。我会使用一个简单的 Makefile,它可以轻松地在同一个 Makefile 中允许两个单独的目标。

    【讨论】:

      【解决方案3】:

      只允许使用一个main 函数。

      根据您的详细信息,两个c 文件都可能包含main 函数。然后你的编译器会产生一个错误。

      【讨论】:

        【解决方案4】:

        正如您提到的,您有两个 C 程序:一个服务器和一个客户端,我有效地假设它们应该作为两个不同的进程(或线程)运行。

        • 将它们分成工作区下(或不同工作区)下的两个不同项目。您可以简单地将其他依赖项(如果有的话)复制到新创建的项目中。
        • 分别编译这两个项目
        • 获取两个可执行文件并运行它们。

        main() 是一个入口函数,因此应该只有一个名为 main() 的函数,因为程序只能有一个入口点。 (是的,有一些例外情况,您可能有多个 main() 实例) 而且,是的,在某些情况下,在将控制权传递给 main() 之前,可能会执行一个或多个函数。
        最可能的情况和示例是基于微控制器的嵌入式系统,其中您有一个重置处理程序和/或一个启动处理程序。


        其他数据(与此问题无关):

        其实,如果你尝试如下声明这两个函数,

        void customDestructor(void) __attribute__ ((destructor));
        

        void customConstructor(void) __attribute__ ((constructor));
        

        你可以在main()被执行之前添加任何你想要的实现。

        【讨论】:

        • 是的,我已经将它们编译为单独的项目。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多