如何编译具有多个主函数的C项目?

Muh*_*edy 11 c ide linker qt-creator

我是C的新手,现在阅读一些教科书并开始应用它的例子.

问题是,每当我创建一个新项目并尝试放置包含main函数的多个文件时,链接器(正如我thougt0解释说的那样:

/home/mohammed/tmp/abcd/main.c:4: multiple definition of `main'
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,我使用了很多IDE,MonoDevelop,QT创建者,VS2010,Codebloks,...)我目前使用QT Creator,它似乎是一个非常好的IDE.

那么,解决这样的问题没有办法解决?

编辑:

我问,因为我正处于学习阶段,现在不做真正的编程.我只需要一种简单的方法来在C中创建程序,而不必为每个书籍示例创建一个单独的项目.同时,我不想使用Gedit/VI +命令行.

那么,是不是有任何方法,如清理项目,然后编译 - 只需一个文件,我需要运行??? 顺便说一句,在JAVA中我们可以运行一个程序,它包含多个主程序(IDE给我选择)

Ark*_*kku 10

你想用多种main功能做什么?

如果您尝试一次编译多个不同的程序,则需要单独编译每个main程序(即每个程序只编译一个).

如果你正在尝试编译一个程序,并希望多个main功能跑,你不能.您只需要指定一个main并将其他内容重命名为其他内容(并main按照您希望它们运行的​​顺序从单个中调用它们).

如果您只是尝试使用其中一个main函数作为程序的单个入口点而忽略其他函数,那么main在链接时不应该将文件包含在其他文件中.main如果您希望保留它们,我建议将每个文件放在一个单独的文件中,并在链接/编译时仅包含其中一个主文件.

如果您错误地收到此错误,那么您可能在IDE中执行了错误的项目.也许你不小心尝试将多个不同的程序编译成一个?您可能需要将包含a的每个文件指定main为单独的构建产品.C不像Java那样可以main在每个类中放入一个方法并指定要调用哪个方法; 在main中C是一个全球性的名称.


SeF*_*SeF 7

在同一个项目中可以有多个 main,如果每个 main 在构建目录树中对应一个不同的可执行文件。

\n\n

以下示例使用 CMake,我不知道是否可以使用其他构建过程管理器软件来完成。

\n\n

将以下两个 .cpp 文件存储在名为source的文件夹中,并将它们命名为 square_root.cpp 和 power_of_two.cpp:

\n\n

square_root.cpp:

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\nint main (int argc, char *argv[])\n{\n\n  if (argc < 2) {\n    fprintf(stdout,"Usage: %s number\\n",argv[0]);\n    return 1;\n  }\n\n  double inputValue = atof(argv[1]);\n  double outputValue = sqrt(inputValue);\n  fprintf(stdout,"The square root of %g is %g\\n",\n          inputValue, outputValue);\n\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

power_of_two.cpp:

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\nint main (int argc, char *argv[])\n\n{\n  if (argc < 2) {\n      fprintf(stdout,"Usage: %s number\\n",argv[0]);\n      return 1;\n  }\n\n  double inputValue = atof(argv[1]);\n  double outputValue = inputValue*inputValue;\n\n  fprintf(stdout,"The power of two of %g is %g\\n",\n          inputValue, outputValue);\n\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,它们都包含一个方法 main。\n然后,在同一文件夹中,添加一个名为 CmakeLists.txt 的 .txt:它将告诉编译器可执行文件的数量、如何调用它们以及在哪里可以找到 main(s)。

\n\n

CmakeLists.txt:

\n\n
cmake_minimum_required (VERSION 2.6)\nproject (Square_and_Power)\nadd_executable(Square2 square_root.cpp)\nadd_executable(Power2 power_of_two.cpp)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在源的同一根目录下创建一个名为build的新文件夹,然后使用cmake进行配置和生成。查看在 build 文件夹中创建的文件夹的结构。\n在 build 中打开一个终端并输入make

\n\n
 \xe2\x86\x92  make\n[ 50%] Built target Power2\nScanning dependencies of target Square2\n[ 75%] Building CXX object CMakeFiles/Square2.dir/square_root.cpp.o\n[100%] Linking CXX executable Square2\n[100%] Built target Square2\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果没有发生错误,您将有两个可执行文件:Square2 和 Power2。

\n\n
\xe2\x86\x92  ./Square2 5\nThe square root of 5 is 2.23607\n \xe2\x86\x92  ./Power2 5\nThe power of two of 5 is 25\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,您有一个具有两个主电源的同一项目,它们编译了两个不同的应用程序。然后,这两个 cpp 文件可以在项目中的其他 .cpp 或 .h 文件中共享相同的标头和附加方法。\n我建议您也看看 cmake 教程https://cmake.org/cmake-tutorial/ \n可能还有其他方法可以得到类似的结果(如果不是相同的结果),但我不知道。希望其他用户对此线程做出贡献!

\n


abe*_*thy 6

您的应用程序中不可能有多个入口点.启动最终可执行文件时,将调用入口点函数(main).这一点不能模棱两可.

所以,如果你想逐个调用它们,你可以像这样链接它们:

void main1() {} /* Note that these aren't called main. */
void main2() {}
...

int main(int argc, char* argv[]) {
    main1();
    main2();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用线程(例如boost.Thread)调用它们,以便它们并行运行.但是你不能将多个名为mainlinked的函数链接在一起.

如果您希望它们分别是单独的程序,则必须单独链接它们.


Muh*_*edy 1

实际上,我发现 Dev-C++ 支持处理不属于任何项目的多个主文件,因此我可以根据需要创建运行任意数量的文件。

感谢所有在这里合作的人:)祝大家好运。

另外,对于 Linux/win,我发现 Code::Blocks 可以做到这一点。谢谢。