mingw版本log4cplus库Qt中编译错误:undefined reference to log4cplus::detail::macro_forced_log ......

本文介绍了一种在Qt中使用mingw编译log4cplus库时遇到的编译错误,并详细解释了解决过程,最终确定为.pro文件中DEFINES-=UNICODE设置导致的问题。

在Qt中使用mingw版本的log4cplus库时出现编译错误如下:

undefined reference to `log4cplus::detail::macro_forced_log(log4cplus::Logger const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'

因为项目依赖了多个库,.pro文件中配置了CONFIG += c++11 c++14,开始以为是c++11和c++14同时出现的问题,经过多次尝试发现该配置无关。

于是新建一个工程,仅仅依赖log4cplus这一个库,编译通过,运行正常。

仔细对比两个工程的.pro文件,发现原工程的.pro文件中有 DEFINES -= UNICODE 的定义,加#注释掉以后编译通过,运行正常。

 

<think>嗯,用户遇到了C++编译错误,提示“undefined reference to __mingw_init_ehandler”,这个问题看起来和MinGW的启动代码有关。根据用户提供的引用信息,crtexe.c是编译器链接的启动代码,其中可能包含入口函数如wmain或main的不同版本。但用户提到找不到宏WPRFLAG的定义,这可能影响入口函数的选择。 首先,这个错误通常是由于链接器找不到某个函数的实现。这里提到的__mingw_init_ehandler可能是MinGW运行时的一部分,负责异常处理初始化。可能的原因包括编译版本不兼容、启动文件缺失或链接顺序问题。 接下来,我需要考虑解决方案。常见的解决步骤可能包括检查MinGW安装是否完整,特别是crt(C运行时)文件是否存在。用户可能需要重新安装或更新MinGW,确保所有必要的文件正确安装。另外,检查编译命令是否正确,是否遗漏了链接或启动文件。有时候,手动指定入口点或者添加特定的启动文件路径可以解决问题。 用户提到的crtexe.c文件,可能需要确认该文件是否被正确编译并链接到项目中。如果使用的是旧版MinGW,可能存在已知的bug,升级到最新版本可能会有帮助。此外,检查项目中的入口函数是否正确,比如使用main还是wmain,是否与编译器期望的一致。如果项目配置中错误地定义了UNICODE相关的宏,可能导致入口函数不匹配,从而引发链接错误。 另外,用户提到的WPRFLAG宏未定义的问题,可能需要查阅MinGW的文档或源代码,确认该宏的作用和定义条件。如果该宏控制入口函数的选择,未定义可能导致链接器找不到相应的初始化代码,进而出现__mingw_init_ehandler的未定义引用错误。 最后,建议用户查看编译日志,确认是否有其他缺失的或文件,并尝试在编译命令中显式链接所需的,如-lgcc或-mwindows等选项。如果问题依旧,可能需要到MinGW的论坛或社区寻求帮助,或者提供更详细的编译信息以便进一步诊断。</think>### 分步解决方案:MinGW编译出现`undefined reference to __mingw_init_ehandler`错误 #### 1. **理解错误原因** 该错误表明链接器无法找到MinGW运行时中的`__mingw_init_ehandler`函数,该函数负责异常处理初始化。此问题通常由以下原因导致: - **MinGW安装不完整**:缺少关键C运行时(crt)文件[^1] - **项目配置错误**:编译参数未正确链接启动文件(如`crt0.o`或`crt2.o`) - **入口函数冲突**:`main()`/`wmain()`未与编译选项匹配 #### 2. **验证MinGW安装** 检查MinGW的`lib`目录下是否存在以下关键文件: ``` # 默认路径示例(x86_64架构) C:\mingw64\x86_64-w64-mingw32\lib\crt2.o C:\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\crtbegin.o ``` 若缺失,需重新安装MinGW并勾选`mingw32-base`和`mingw32-gcc`组件。 #### 3. **添加启动文件链接** 在编译命令中显式指定启动文件路径: ```bash g++ -o output.exe main.cpp -L"C:/mingw64/x86_64-w64-mingw32/lib" \ -Wl,--start-group \ -lmingw32 -lgcc -lgcc_eh -lcrt2.o \ -Wl,--end-group ``` #### 4. **检查入口函数匹配性** | 入口函数类型 | 编译选项 | 适用场景 | |----------------|------------------------|-------------------| | `main()` | 默认(无特殊选项) | ANSI控制台程序 | | `wmain()` | `-municode` | Unicode控制台程序 | | `WinMain()` | `-mwindows` | ANSI GUI程序 | | `wWinMain()` | `-mwindows -municode` | Unicode GUI程序 | 若使用`wmain()`但未添加`-municode`选项,会导致启动代码不匹配。 #### 5. **升级MinGW版本** 旧版本(如GCC 5.x)可能存在已知的crt链接问题。推荐使用以下方法升级: ```bash # 使用MSYS2更新 pacman -Syu pacman -S mingw-w64-x86_64-toolchain ``` #### 6. **完整编译示例** 针对使用`wmain()`的Unicode控制台程序: ```bash g++ -municode -o app.exe main.cpp \ -Wl,--start-group \ -lmingw32 -lgcc -lgcc_eh -lcrtdll \ -Wl,--end-group ``` #### 7. **验证解决方案** 编译成功后,使用`objdump`检查导入表: ```bash objdump -x app.exe | grep -i '__mingw_init_ehandler' ``` 应显示该符号已正确解析。 [^1]: 引用信息表明MinGW通过`crtexe.c`管理入口函数,`__mingw_init_ehandler`属于异常处理初始化例程,其实现位于`libgcc`中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值