winx移植手记:支持dev-c++, mingw32

本文记录了将WinX从Visual C++移植到GCC的过程及挑战,重点介绍了在使用Dev-C++和mingw32编译器时遇到的问题,如调试困难、fastcall调用不支持等。

winx移植手记:支持dev-c++, mingw32

许式伟
2007-1-14

 
移植winx到gcc编译器,确实比 移植到Visual C++ 2003辛苦一些,花了我整整一天时间,还只是移植了 winx中的一个子库: stdext(C++标准扩展部分)。感兴趣可到 这里下载。因为仍然是windows平台开发,我选择的是Dev-C++, mingw32。之所以是Dev-C++作为开发平台,是依据大家在《 WINX调查:您使用什么C++开发平台?》的反馈决定的。
 
考虑到现在已经比较晚了,我先简单把一些感受比较强烈的东西记一下:
  • 总体说来,对模板编译的支持,gcc比Visual C++系列(包括Visual C++ 2005)好很多。有不少细节上的看起来非常愚蠢的手误,由于代码没有用到,VC++就无法检查出来,用gcc很快就原型毕露了。对于VC++这种不调用就不进行一般性的语法检查的做法,我一直持否定的态度。虽然这可能加快了编译速度,但是对库的提供者无疑是不利的。
     
  • gcc对语法的检查比VC++严格,这有利于你编写更符合C++标准的代码。
以上是赞美的话,但是相对来说,问题似乎更多:
  • Microsoft的调试器真的是无可匹敌。用惯了Visual Studio,用gcc/gdb的调试实在痛苦。
    • 我太习惯看函数调用栈了,Dev-C++的调试居然没有函数调用栈,不知道是gdb不支持,还是Dev-C++没有做。
    • 当我要看一个结构体的内容时,Dev-C++只是打印该结构体的地址,并不显示更详细的信息。例如当你调试到某个类成员函数时,希望看看this对象的总体状态,却苦于没有办法。
       
  • mingw32似乎没有支持fastcall调用,这是一个莫名奇妙的错误。由于一开始我压根没想到调用方式的问题,耽误了我不少时间。由于winx中所有的函数调用都采用winx_call,它被定义为__fastcall。mingw32并不报告这是一个错误,但是程序的执行却产生了非法操作。尝试去调试函数调用的跳转却非常奇怪,跑到一个根本没有调用过的函数上去了。由于现象奇特,我意识到这可能是由于调用方式引起的,把winx_call定义为cdecl,问题得以解决。
     
  • 后来我想到gcc中调用方式的写法和VC++不太一样,应该写成:__attribute__ (( fastcall)),但问题依旧。
     
  • mingw32编译出来的exe有点大(与Visual C++相比)。同样的代码(控制台程序),VC++ 6.0编译是44k,mingw32编译出来是521k(Release版本)。
对于Dev-C++,总体感觉还可以,有以下几点觉得需要改进:
  • Dev-C++的工程文件过于简单,不支持多种配置。
  • 函数跳转。VC++配上Visual Assist,按Alt+G跳转习惯了,没有这个功能还真不习惯。不过这个功能确实不易做。
  • Find in Files功能支持在工程中找,也支持在所有打开的文件中找,唯独少了我觉得最实用的:在一个目录中找。
我用gcc也算有一段日子了,但是Dev-C++是首次使用,有些结论可能是我认识不足所致。把它写出来,也是欢迎有经验的朋友可以指出其中的错误,也欢迎与我交流心得。

 对winx感兴趣?请到这里下载。




<think>我们正在解决Windows系统上安装MySQL 8.0.43时遇到的服务问题。根据用户描述,他们已经尝试了移除服务、初始化并重新安装,但服务无法启动。结合之前提供的解决方案和引用内容,我们逐步排查。 关键点: 1. 服务已存在:用户已经通过`mysqld --remove`移除了旧服务,然后重新安装。 2. 系统找不到指定文件:可能是因为配置文件缺失或路径错误。 3. 服务无法启动:需要检查错误日志。 步骤: 1. 确保有正确的配置文件`my.ini`,并配置了正确的`basedir`和`datadir`。 2. 初始化数据目录(如果之前没有正确初始化,会导致启动失败)。 3. 安装服务时指定配置文件(避免使用默认配置)。 4. 检查错误日志(位于`datadir`下,以`.err`为扩展名)获取具体错误信息。 根据引用[1],我们需要检查错误日志,常见错误包括端口冲突、配置文件错误、权限不足等。 具体步骤: 第一步:创建配置文件 在MySQL安装目录(`D:\Program Files\mysql-8.0.43-winx64`)下创建`my.ini`文件,内容如下: ```ini [mysqld] basedir = "D:/Program Files/mysql-8.0.43-winx64" datadir = "D:/Program Files/mysql-8.0.43-winx64/data" port = 3306 character-set-server = utf8mb4 default_authentication_plugin = mysql_native_password [client] default-character-set = utf8mb4 ``` 注意:路径中使用正斜杠或双反斜杠(如`D:\\Program Files\\mysql-8.0.43-winx64`)以避免转义问题。 第二步:初始化数据目录 以管理员身份打开命令提示符,执行: ```cmd cd /d "D:\Program Files\mysql-8.0.43-winx64\bin" mysqld --initialize-insecure --console ``` 注意:`--initialize-insecure`会初始化数据目录,且root用户没有密码。如果之前已经有`data`目录,建议先删除再初始化。 第三步:安装服务并指定配置文件 ```cmd mysqld --install MySQL80 --defaults-file="D:\Program Files\mysql-8.0.43-winx64\my.ini" ``` 这里使用服务名`MySQL80`,避免与已有的`mysql`服务冲突。如果之前安装过,确保旧服务已移除。 第四步:启动服务 ```cmd net start MySQL80 ``` 如果仍然无法启动,检查错误日志(位于`D:\Program Files\mysql-8.0.43-winx64\data`目录下,文件名为`主机名.err`)。根据日志中的错误信息进一步处理。 常见问题处理: 1. 端口冲突:使用`netstat -ano | findstr :3306`检查,如果被占用,修改`my.ini`中的`port`为其他端口(如3307)。 2. 权限问题:确保MySQL安装目录和数据目录对运行MySQL服务的用户(通常是`SYSTEM`)有完全控制权限。 - 右键点击目录 -> 属性 -> 安全 -> 编辑 -> 添加用户`SYSTEM`(或`NETWORK SERVICE`)并赋予完全控制权限。 3. 服务注册表问题:参考引用[2],检查注册表路径`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL80`,确保`ImagePath`的值指向正确的`mysqld`路径,并且包含`--defaults-file`参数(例如:`"D:\Program Files\mysql-8.0.43-winx64\bin\mysqld" --defaults-file="D:\Program Files\mysql-8.0.43-winx64\my.ini" MySQL80`)。 4. 如果初始化失败,检查`data`目录是否为空,如果非空则删除整个`data`目录然后重新初始化。 注意:如果之前安装过MySQL,请确保彻底卸载(停止服务、移除服务、删除注册表项、删除安装目录和数据目录)。 第五步:启动服务并测试 启动成功后,使用以下命令连接MySQL(无密码): ```cmd mysql -u root ``` 如果以上步骤仍无法解决,请提供错误日志中的具体错误信息。 相关问题: 1. 如何修改MySQL的默认端口? 2. 如何为MySQL的root用户设置密码? 3. 如何彻底卸载MySQL服务? 4. 如何配置MySQL的环境变量? </think>### ️ Windows系统MySQL 8.0.43安装问题解决方案 #### 🔍 核心问题诊断 根据您的操作记录和服务报错,主要存在三个关键问题: 1. **服务残留冲突**:旧服务未完全卸载导致新服务安装失败 2. **文件路径错误**:`系统找不到指定文件`表明配置文件或数据目录路径异常 3. **权限/端口冲突**:服务启动失败通常由端口占用或目录权限引起 --- ### 📍 完整解决步骤(需管理员权限) #### 步骤1:彻底卸载MySQL服务 ```cmd :: 停止并删除现有服务 net stop MySQL sc delete MySQL :: 清理残留注册表项 reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL80" /f ``` #### 步骤2:创建正确配置文件 在 `D:\Program Files\mysql-8.0.43-winx64` 创建 **my.ini**: ```ini [mysqld] basedir = "D:/Program Files/mysql-8.0.43-winx64" datadir = "D:/Program Files/mysql-8.0.43-winx64/data" port = 3307 ; 避免端口冲突[^1] character-set-server = utf8mb4 default_authentication_plugin = mysql_native_password innodb_buffer_pool_size = 128M ; 内存优化 [client] port = 3307 default-character-set = utf8mb4 ``` > 💡 关键点: > - 使用正斜杠 `/` 或双反斜杠 `\\` 避免路径转义错误 > - 修改默认端口(3307)避开常见占用 #### 步骤3:重建数据目录与权限 ```cmd :: 删除旧数据目录 rd /s /q "D:\Program Files\mysql-8.0.43-winx64\data" :: 初始化数据目录 mysqld --initialize-insecure --console --basedir="D:\Program Files\mysql-8.0.43-winx64" --datadir="D:\Program Files\mysql-8.0.43-winx64\data" :: 授予目录权限 icacls "D:\Program Files\mysql-8.0.43-winx64" /grant "Everyone:(OI)(CI)F" ``` #### 步骤4:重新安装服务 ```cmd :: 带配置文件安装服务 mysqld --install MySQL80 --defaults-file="D:\Program Files\mysql-8.0.43-winx64\my.ini" :: 启动服务 net start MySQL80 ``` --- ### ️ 故障排查指南 | 错误现象 | 解决方案 | |---------|----------| | **服务无法启动** | 检查 `data\*.err` 日志文件<br>运行 `netstat -ano | findstr :3307` 查端口占用 | | **系统找不到文件** | 验证注册表路径:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL80`<br>确保 `ImagePath` 包含完整路径 | | **权限拒绝(5)** | 运行:`icacls "D:\Program Files\mysql-8.0.43-winx64" /reset`<br>服务管理器中授予`NETWORK SERVICE`完全控制权 | | **表不存在错误** | 删除整个 `data` 目录后重新执行 `--initialize-insecure` | > 📌 **重要提示**:使用 `MySQL80` 服务名避免与旧版本冲突,所有操作需在**管理员CMD**完成[^2] --- ### ✅ 验证安装成功 ```cmd mysql -uroot -P3307 -e "SELECT @@version;" ``` 成功输出应显示:`8.0.43` --- ### ❓ 相关问题 1. 如何永久添加MySQL到系统PATH环境变量? 2. MySQL 8.0默认密码策略是什么?如何修改? 3. 如何配置Windows防火墙允许MySQL端口? 4. 使用MySQL Workbench连接新实例需要注意什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值