测试基于Ubuntu16.04 Eclipse for C/C++
参考链接:链接
适用于:在一个Project中,有多个*.cpp/*.c文件,多个文件中同时含有main函数。处于方便考虑,在Makefile文件中,目标可执行文件的依赖项,包含了所有源文件编译生成的*.o文件。这样的话,在编译的时候,就会产生main函数重复定义的错误。
例如,在一个Project中,有main.cpp和test.cpp两个源代码文件,位于src目录下,每一个文件中都有一个main函数,分别用于生成两个不同的目标可执行文件Main和Test。为了方便,在Makefile文件中是这样写的:
1 2 3 4 5 6 7 |
OBJ=./src/main.o ./src/test.o
Main:${OBJ} ${CXX} ${OBJ} $(LIBS) -o $@
Test:${OBJ} ${CXX} ${OBJ} $(LIBS) -o $@ |
这样的话,在生成目标可执行文件Main或者Test时,均会对两个*.o文件的内容进行分析、链接,导致产生main函数重复定义的错误。
为了解决上述问题,使用了Makefile的条件编译功能。
在C/C++源代码中,main函数用#ifdef和#endif包含起来,例如:
1 2 3 4 5 6 7 8 9 |
#ifdef TEST_
int main() { system("/home/xingyu/Desktop/test.sh abc");
return 0; }
#endif |
上述例子中的宏"TEST_",不在C/C++源代码中定义,而是在调用GCC/G++编译器时,通过参数"-D TEST_"定义。对于不同的目标文件,用不同的宏将对应的main函数包含起来,再在调用时分别加入不同的"-D xxxxx"参数即可。
对于Makefile文件,可以用以下方式来处理:
1 2 3 4 5 6 7 8 9 |
CXXFLAGS = -c -O2 -g -Wall -fmessage-length=0 -I ${INC_DIR}
ifeq ($(TARGET),Test) CXXFLAGS += -D TEST_ endif
ifeq ($(TARGET),Main) CXXFLAGS += -D MAIN_ endif |
其中CXXFLAGS是GCC/G++在编译时的一系列参数,