[wxWidgets]_[初级]_[Debug Assertion Failure: BLOCK_TYPE_IS_VALID(pHead->nBlockUse) ]

wxWidgets 3.0 PopupMenu 报错解决
在使用wxWidgets 3.0.0版本时,通过堆栈创建PopupMenu导致BLOCK_TYPE_IS_VALID断言失败的问题。该问题在2.9.2版本中未出现,解决方案为通过new操作符创建wxMenu实例。


场景:

1.在使用wxWidgets 3.0.0(vc x86)版本的库时,调用在stack上创建的.

PopupMenu(&help_menu);

报错

Debug Assertion Failure: BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 

之前在 2.9.2 都没出现过这种情况,看了一下,也有人遇到类似的情况,但不是用 PopupMenu.查看 samples 里的例子,也是通过创建局部的 wxMenu 来弹出的,很奇怪.

http://wxwidgets.10942.n7.nabble.com/Debug-Assertion-Failure-BLOCK-TYPE-IS-VALID-pHead-gt-nBlockUse-td84936.html

通过new出来wxMenu解决这类问题.

wxMenu *language = new wxMenu();


备注: 没时间看源代码,暂时先这样吧.

<think>我们正在解决编译时无法找到wxWidgets库和相关文件(如wx.bkl)的问题,特别是在构建OpenCPN 5.13.0时。 根据引用[1]中的信息,推荐从源码构建wxWidgets库,因为直接使用预编译库可能不匹配环境。 同时,引用[2]中提到使用旧版本的库可能会遇到问题,需要自行编译。 引用[3]则提示了在交叉编译时可能缺少X11头文件的问题。 因此,我们采取以下步骤: 步骤1: 安装编译wxWidgets所需的依赖 在Ubuntu/Debian系统上,执行以下命令: sudo apt-get update sudo apt-get install -y build-essential libgtk-3-dev libgl1-mesa-dev libglu1-mesa-dev libjpeg-dev libtiff5-dev libpng-dev libsm6 freeglut3-dev 步骤2: 下载并构建wxWidgets源码 建议使用3.2.4版本(与引用[1]中一致),因为OpenCPN 5.13.0可能对该版本有较好支持。 cd ~ wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.4/wxWidgets-3.2.4.tar.bz2 tar -xvjf wxWidgets-3.2.4.tar.bz2 cd wxWidgets-3.2.4 mkdir build cd build 步骤3: 配置wxWidgets 使用以下配置命令,注意设置安装路径(例如/opt/wxWidgets-3.2.4)以避免系统路径冲突,并确保构建静态库(因为OpenCPN可能需要静态链接): ../configure --prefix=/opt/wxWidgets-3.2.4 --with-gtk=3 --enable-unicode --with-opengl --disable-shared --enable-monolithic 注意: - `--disable-shared` 构建静态库 - `--enable-monolithic` 构建单一大库,简化链接 步骤4: 编译和安装 make -j$(nproc) sudo make install 步骤5: 设置环境变量 为了让CMake找到wxWidgets,需要设置环境变量: export wxWidgets_ROOT_DIR=/opt/wxWidgets-3.2.4 export PATH="$wxWidgets_ROOT_DIR/bin:$PATH" export LD_LIBRARY_PATH="$wxWidgets_ROOT_DIR/lib:$LD_LIBRARY_PATH" 步骤6: 构建OpenCPN 在OpenCPN源码目录中,创建build目录并进入: cd opencpn-5.13.0 mkdir build cd build 使用CMake配置,指定wxWidgets的位置: cmake -DwxWidgets_ROOT_DIR=/opt/wxWidgets-3.2.4 -DwxWidgets_CONFIG_EXECUTABLE=/opt/wxWidgets-3.2.4/bin/wx-config .. 然后编译: make 如果仍然遇到与wx.bkl相关的问题,这可能是因为OpenCPN的构建系统使用了bakefile,而我们在构建wxWidgets时已经生成了这些文件,并安装到了/opt/wxWidgets-3.2.4/share/bakefile目录下。我们需要确保CMake能够找到这些文件,或者在OpenCPN的CMake配置中禁用bakefile的使用(如果可能)。 另一种方法:在CMake配置OpenCPN时,设置bakefile的路径: cmake ... -DBAKEFILE_DIR=/opt/wxWidgets-3.2.4/share/bakefile ... 但是,OpenCPN的CMakeLists.txt可能没有直接提供这个选项。我们可以查看OpenCPN的CMakeLists.txt,看是否有相关设置。 如果问题仍然存在,我们可以尝试在构建wxWidgets时确保bakefile被正确安装。在wxWidgets的构建步骤中,我们使用`make install`已经安装了这些文件,所以应该位于/opt/wxWidgets-3.2.4/share/bakefile/presets目录下。 另外,我们可以考虑在OpenCPN的CMakeCache.txt中手动设置变量,或者在CMake命令行中传递: -DBAKEFILE_PRESETS_PATH=/opt/wxWidgets-3.2.4/share/bakefile/presets 注意:具体的变量名需要参考OpenCPN的构建文档。 如果以上方法都不能解决问题,我们可以尝试使用系统包管理器安装wxWidgets的bakefile(如果有): sudo apt-get install bakefile 但注意,这样安装的bakefile可能版本不匹配。 最后,如果问题仍然存在,我们可以考虑使用动态链接(即构建wxWidgets时不使用`--disable-shared`),因为某些项目可能依赖动态库。但是,OpenCPN通常使用静态链接以减少依赖。 综上所述,我们优先采用从源码构建wxWidgets并设置正确的路径。 注意:在构建OpenCPN时,还可能存在其他依赖,如OpenGL、curl等,需要根据OpenCPN的文档安装。 生成相关问题: 1. 如何为OpenCPN配置wxWidgets以外的依赖项? 2. 在Linux系统上如何静态链接wxWidgets库? 3. 如何解决构建OpenCPN时遇到的bakefile错误? </think>### 解决编译时无法找到 wxWidgets 库和相关文件(如 wx.bkl)的完整方案 #### 问题核心原因分析 1. **路径配置错误**:CMake 无法定位 wxWidgets 的安装路径或源码路径 [^1] 2. **文件缺失**:`bakefiles` 预设文件未正确生成或安装(如 wx.bkl) 3. **版本不匹配**:OpenCPN 5.13.0 需要特定版本的 wxWidgets(推荐 3.2.4) --- ### 解决方案分步指南 #### 1. 正确安装 wxWidgets 3.2.4(源码编译) ```bash # 安装依赖 sudo apt-get install -y libgtk-3-dev libgl1-mesa-dev libjpeg-dev libtiff-dev libwebkit2gtk-4.0-dev # 下载源码 wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.4/wxWidgets-3.2.4.tar.bz2 tar -xvf wxWidgets-3.2.4.tar.bz2 cd wxWidgets-3.2.4/ # 配置并构建 mkdir build && cd build ../configure --prefix=/usr/local --with-gtk=3 --enable-unicode --with-opengl make -j$(nproc) sudo make install sudo ldconfig # 更新库缓存 ``` #### 2. 修复 bakefiles 文件缺失问题 ```bash # 手动创建预设目录 sudo mkdir -p /usr/local/share/bakefile/presets # 复制预设文件 cd wxWidgets-3.2.4/build/bakefiles/wxpresets/presets sudo cp *.bkl *.py /usr/local/share/bakefile/presets/ ``` #### 3. 配置 OpenCPN 5.13.0 的 CMake(关键步骤) ```bash cd opencpn-5.13.0/build cmake .. \ -DwxWidgets_CONFIG_EXECUTABLE=/usr/local/bin/wx-config \ -DCMAKE_PREFIX_PATH=/usr/local \ -DBAKEFILE_PRESETS_PATH=/usr/local/share/bakefile/presets ``` #### 4. 验证路径配置 创建 `find_wx.cmake` 测试文件: ```cmake # find_wx.cmake find_package(wxWidgets REQUIRED COMPONENTS core base) message(STATUS "wxWidgets found at: ${wxWidgets_LIBRARIES}") ``` 运行测试: ```bash cmake -P find_wx.cmake ``` 正常输出应显示: ``` -- wxWidgets found at: /usr/local/lib/libwx_gtk3u_core-3.2.so;/usr/local/lib/libwx_baseu-3.2.so ``` #### 5. 构建 OpenCPN ```bash cd opencpn-5.13.0/build cmake --build . --config Release -j$(nproc) ``` --- ### 故障排除表 | 错误现象 | 解决方案 | |---------|---------| | `Could NOT find wxWidgets` | 设置 `-DwxWidgets_CONFIG_EXECUTABLE=/usr/local/bin/wx-config` | | `Missing wx.bkl` | 手动复制预设文件到 `/usr/local/share/bakefile/presets` | | `X11/Xlib.h not found` | 安装 `sudo apt-get install libx11-dev` [^3] | | 链接错误 `undefined reference` | 确保配置包含 `--enable-monolithic` 构建单一大库 | --- ### 附加优化建议 1. **使用 vcpkg 管理依赖**(推荐): ```bash vcpkg install wxwidgets:x64-linux cmake .. -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ``` 2. **静态链接配置**(减小二进制体积): ```bash ../configure --disable-shared --enable-monolithic ``` 3. **ARM 交叉编译支持**: ```bash ../configure --host=arm-linux-gnueabihf --with-gtk=3 ``` > **关键提示**:OpenCPN 要求 wxWidgets 必须启用 WebView 支持,配置时需添加 `--enable-webview`,否则会出现运行时功能缺失 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行峰 (花名)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值