在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!
第一步,在项目的Properties中定位到”C/C++ Build”,在右边的面板中点击”Manage Configurations…”,随后选择”New…”新建一个配置(图1),取名MyDebug并从已有的Debug配置复制(图2)。之后回到图1的窗口,在顶部下拉菜单中选择MyDebug。”Makefile generation”区域有一个选项”Generate Makefiles automatically”,因为我们要自己编写,所以去掉勾选。随后可选择性的编辑”Build directory”,为简单起见,建议设为项目所在的根目录,需要注意的是这个必须是你存放Makefile的路径。
第二步,编写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)
|
第三步,编译项目。如果有选择”Build Automatically”就不用操心了,Eclipse会根据你的Makefile工作,并且不会再出现多个main函数的错误。否则,点击工具栏上的Build标志旁边下拉按钮并选择MyDebug,这样Eclipse会找到Makefile中定义的第一个target也就是all来分别编译两个对象。另外,如果想单独编译其中某个target,可选择Project菜单 – Make Target – Build… – Add… 名字取与Makefile中相同的target名,比如tcp_client。而后选中刚创建的target,点击Build就可以了。