Eclipse+Cygwin64编译C++单元测试出现WinMain未定义引用错误求助
Eclipse+Cygwin64构建C++单元测试遇WinMain未定义引用错误
环境信息
- Eclipse版本:Luna Service Release 2 (4.4.2)
- Cygwin版本:Cygwin64,g++ (GCC) 10.2.0
- 目标:适配C17标准的C/C项目单元测试
- 环境路径已配置:
C:\cygwin64\bin
错误现象
构建测试套件时出现WinMain未定义引用,控制台输出如下:
make all Building file: C:/Accurev/AngioJet_Development_ver1/CS/AngioJet/Firmware/src/ClinicalFeatures/door.cpp Invoking: Cygwin C++ Compiler g++ -DUNIT_TESTING - "C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/build/PicoZed_FSBL_bsp/ps7_cortexa9_0/include" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../testsupport/" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../testsupport/Source" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/src/Platform/Zynq7000" - I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/src/HostInterface" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/soup/treck/6_0_1_56/include" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../Einstein/src/Platform/Zynq7000" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../Einstein/src/Common" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/src/Common" -I"C:/Accurev/AngioJet_Development_ver1/CS/ut/testsuites/Firmware/hell/../../../../AngioJet/Firmware/src/ClinicalFeatures" -O0 -g -fprofile-arcs -ftest-coverage -Wall -c -fmessage-length=0 -MMD -MP -MF"src/door.d" -MT"src/door.d" -o "src/door.o" "C:/Accurev/AngioJet_Development_ver1/CS/AngioJet/Firmware/src/ClinicalFeatures/door.cpp" Finished building: C:/Accurev/AngioJet_Development_ver1/CS/AngioJet/Firmware/src/ClinicalFeatures/door.cpp Building target: helll.exe Invoking: Cygwin C++ Linker g++ -fprofile-arcs -o "helll.exe" ./src/door.o -lgcov -lbfd /usr/lib/gcc/x86_64-pc-cygwin/10/../../../../x86_64-pc-cygwin/bin/ld: /usr/lib/gcc/x86_64-pc-cygwin/10/../../../../lib/libcygwin.a(libcmain.o): in function `main': /usr/src/debug/cygwin-3.3.6-1/winsup/cygwin/lib/libcmain.c:37: undefined reference to `WinMain' collect2: error: ld returned 1 exit status make: *** [makefile:47: helll.exe] Error 1 07:05:17 Build Finished (took 4s.531ms)
已尝试操作
- 卸载并重新安装Eclipse和Cygwin
- 新建测试项目可正常构建,但现有项目始终失败
- Cygwin终端中手动编译测试代码可正常执行
项目代码
源文件
door.h
#include "global.h" namespace lDOOR { void close( BasicTypes::UInt8 mode ); }
door.cpp
#include "door.h" void lDOOR::close(void) { //Normal Mode close(BscMsg::NORMAL); }
单元测试文件 door_testsuite.h
#include <cxxtest/TestSuite.h> class door_TestSuite: public CxxTest::TestSuite { public: void setUp(){} void teardown(){} void testDoorLDoorClose() { BscMsg::UInt8 mode = 2; lDOOR::close(mode); TS_ASSERT_EQUALS(); }};
解决方法
1. 添加链接器控制台模式参数
进入Eclipse项目配置的C/C++ Build > Settings > Cygwin C++ Linker > Miscellaneous,在Linker flags中添加-mconsole。该参数强制g++生成控制台程序,让链接器寻找标准main函数而非WinMain。
2. 确保CxxTest测试驱动代码被正确处理
CxxTest需要自动生成包含main函数的测试驱动文件,需检查:
- 进入
C/C++ Build > Settings > CxxTest,确认已启用CxxTest支持,且door_testsuite.h被纳入处理列表。 - 确认生成的测试驱动文件(如
door_testsuite.cpp)已添加到项目源文件中,参与编译和链接。
3. 同步新项目的正确构建配置
对比新建项目与现有项目的C/C++ Build > Settings配置,重点同步编译器、链接器参数以及源文件包含列表,将新项目的有效配置移植到现有项目中。
4. 修正代码语法问题
door.cpp中函数定义与头文件声明不匹配:头文件声明为void close(BasicTypes::UInt8 mode),cpp中定义为void lDOOR::close(void),需修正为匹配的签名:
#include "door.h" void lDOOR::close(BasicTypes::UInt8 mode) { // 实现逻辑 }
- 测试文件中
TS_ASSERT_EQUALS()缺少参数,补充预期值与实际值,例如TS_ASSERT_EQUALS(mode, BscMsg::NORMAL);。
内容的提问来源于stack exchange,提问作者Neetika
相关产品推荐
相关产品推荐

