在C/C++项目中有时候会需要在一个项目中包含多个main函数。在Visual Studio中,这种情况可以由一个解决方案下带多个项目来解决,但在Eclipse CDT中没有解决方案这样的概念。其实通过定制的Makefile,Eclipse CDT也可以很容易达到目的,对于习惯了Makefile的程序员来说可能觉得这样反而更灵活。默 认情况下,Eclipse CDT会为项目的Debug和Release配置都自动产生makefile,而且这个自动产生的makefile是会尝试把所有源文件编译并生成单独的 一个以项目名命令的二进制文件。而如果你的项目有两个以上的文件带有main函数,Eclipse就会报错:


multiple definition of `main’


既然Eclipse也是通过makefile来,那么一定通过能自己修改或创建makefile的方法让Eclipse知道哪些时候该敢什么,而不 是不按你的意图做事。通过一番尝试,我找到了可行之道。下面以一个简单的例子来说明怎么在Eclipse里面随心所欲的使用makefile。

假设我们有一个很简单的C/S结构的项目,包含客户端和服务端这两个需要编译的目标。现在你已经写好了代码:tcp_server.cpp, tcp_client.cpp。那么Let’s do it now!

在Eclipse CDT中编译含有多个main函数的项目_解决方案

第一步,在项目的Properties中定位到”C/C++ Build”,在右边的面板中点击”Manage Configurations…”,随后选择”New…”新建一个配置(图1),取名MyDebug并从已有的Debug配置复制(图2)。之后回到图1 的窗口,在顶部下拉菜单中选择MyDebug。”Makefile generation”区域有一个选项”Generate Makefiles automatically”,因为我们要自己编写,所以去掉勾选。随后可选择性的编辑”Build directory”,为简单起见,建议设为项目所在的根目录,需要注意的是这个必须是你存放Makefile的路径。

在Eclipse CDT中编译含有多个main函数的项目_eclipse_02

第二步,编写Makefile,注意要放在上面所设置的路径下,还要注意如果不在代码文件同一目录,需要在Makefile中用”..”操作符跳转路径。我在这个例子中使用的Makefile如下:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

​#demo multiple target project​​​​#fwoncn​​​​CC := g++​​​​RM := ​​​​rm​​​​-rf​​​​LIBS := -l boost_system -l boost_thread​​​​all : tcp_client tcp_server​​​​clean :​​​​​​​​$(RM) tcp_client tcp_server​​​​tcp_client : tcp_client.cpp​​​​​​​​$(CC) tcp_client.cpp -o tcp_client $(LIBS)​​​​tcp_server : tcp_server.cpp​​​​​​​​$(CC) tcp_server.cpp -o tcp_server $(LIBS)​


在Eclipse CDT中编译含有多个main函数的项目_main函数_03

第三步,编译项目。如果有选择”Build Automatically”就不用操心了,Eclipse会根据你的Makefile工作,并且不会再出现多个main函数的错误。否则,点击工具栏上 的Build标志旁边下拉按钮并选择MyDebug,这样Eclipse会找到Makefile中定义的第一个target也就是all来分别编译两个对 象。另外,如果想单独编译其中某个target,可选择Project菜单 – Make Target – Build… – Add… 名字取与Makefile中相同的target名,比如tcp_client。而后选中刚创建的target,点击Build就可以了。