(转载)MinGW开发的经历感想和一些链接
2010-09-09 13:54
357 查看
MinGW开发的经历感想和一些链接
文章来源网络 属于c/c++分类 电脑编
程网整理 2010/8/4
上一篇: C++将对象写入二进制文件
下一篇:ctgas
插件
简介:这是MinGW开发的经历感想和一些链接的详细页面,
介绍了和c/c++,C MinGW开发的经历感想和一些链接有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处
所谓MinGW,就是gcc在windows平台上的port(所生成的exe,是导入原生windows
DLL代码的exe,而非mfc,也不是可以在linux平台上跑的程序),MinGW追求exe的最小化,一般用于生成控制台程序,可以用CDT开发,
是个人最喜欢的编译器。由于它的SDK很特别,是windows和linux的交集,要学习用它非常让人头疼,但让我更为喜欢它(因为对于我这种不愿意放
弃windows转向linux的菜鸟来说,用mingw是最好的安慰)
?
我曾经想把一些开源项目使用mingw编译,例如那个号称不可能用mingw编译的httpd(Apache那个C写的基于APR跨平台库的
http服务器),结果发现是可以的(如果硬要用Windows的平台API去config)。我承认学习这东西多大用:
1. 不能攒钱
2. 还不如你去Linux下写个gcc
?
但我觉得学习它也没什么不好——就像你用记事本写网页那样。
?
最开始,我接触到gba编程,发现msys,那时我主要使用vc6开发。
然后,我接触到一些开源项目,需要使用linux环境,我开始尝试用mingw的命令行去config或者make。
后来,我接触到lua,ruby,python等等语言的源代码,开始研究vc6和mingw在编译方面的区别和细节问题。
现在,我转为研究Java和Actionscript,但仍打算在业余时间研究lua的开发库(lua的库可以使用C开发),用CDT+MinGW
编译。
?
我研究过一些gcc的开源项目,
有些不能用mingw编译,例如著名的ncurses(虽说有个替代品pdcurses,但貌似不是完全一样)。
有些是号称不支持vc6但支持mingw的,例如著名的iconv库。
有些甚至不让你config,例如我前面说的httpd。
不知道是不是我菜鸟,反正用mingw就得做好心理准备要去到处google找方法。
?
mingw是我又爱又恨的东西,它能做到cygwin的一半我觉得也很厉害了(毕竟mingw是使用gcc的SDK但又想尽方法兼容windows
平台API的SDK,而且windows的底层和linux的底层差别也很大的)我喜欢它,可能更多是因为对开源开发者,程序移植和硬件开发者们的崇敬和
向往。如果你能忍受mingw带来的痛苦,你就能感受到开源项目的伟大。但mingw不太适合喜欢快速开发的人(比如写Actionscript和
Java的人)
?
我现在仍努力想发掘mingw的开发技巧(因为它的使用需要对gcc的编译机制极其熟悉),所以找了一些网站,我觉得很值得一看的。有些人把
flash开发作为第二生命,我大概会说mingw是我的second
life。(顺便一提,我是很不喜欢用cygwin编译,除非万不得已或者急着要用)
?
(mingw的特点,你必须上网找补丁或者编译资料,除非代码自身支持mingw平台,例如lua的源代码里的Makefile)
?
?
(以上废话说完)
------------------------------------------------------------------
?
1.
TuxPaint。如果你想用mingw编译sdl,gtk,可以参考tuxpaint作者给出的文档,里面介绍了一些旧版本的mingw编译方法,很详
细。
http://johnnypops.demon.co.uk/mingw/
?
2. MozillaBuild。一个配好的命令行编译环境(包括mingw)可以参考它的方法自己定制绿色版的msys/mingw。
ftp://ftp.mozilla.org/pub/mozilla/libraries/win32 https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Windows_Prerequisites
?
3. MinGW。官方提供的支持mingw编译的软件清单。罗列了很多出名的C/C++开发库
http://www.mingw.org/wiki/Community_Supplied_Links
?
4. Haxe。说了一些mingw编译的技巧
http://haxe.org/doc/build/haxe_windows
?
5.?一些mingw的编译src?
http://www.evolane.com/download/mirror/mingw/
?
6. 一些库的mingw预编译(只包含头文件和库文件)
http://cefiro.homelinux.org/resources/mingw-repository/release/
?
7. MinGW MSys GTK Configuration
Guide(话说回来GTK+的源代码是我另一个已知的难编译的库,至今仍没成功用mingw编译过)
http://gcam.js.cx/index.php/MinGW_MSys_GTK_Configuration_Guide
?
8.
PostgreSQL。它的源代码提及到一些linux专有的头文件怎么用windows平台SDK的头文件代替,对mingw移植有点帮助(因为
mingw支持直接用windows的SDK头文件,用这种方法避开编译错误)。
http://www.postgresql.org/
?
?
?
?
?
?
?
?
?
?
--------------------------------------------------------------------------------------
下面是一些个人见解和经验摘录:
一、为什么喜欢MinGW
首先,MinGW不是万能。
我不是排斥VC,BC和Cygwin,
MinGW解决不了很多问题,比如内存泄漏问题没有专门的工具可以检查。
MinGW也没办法解决汇编的移植问题。
?
其次,MinGW不是垃圾。在CDT和别的工具的帮助下,
可以用它熟悉Linux的命令行操作和编译流程,
更重要的是,我体会到移植的艰难。
我曾经因为./configure失败就认为是MinGW没用,后来发现是一种愚蠢的想法。
那些支持MinGW的库大多需要额外的代码判断(例如增加__MINGW32__的宏判断)
通常C库的开发者都不愿意花过多精力,或者大幅度修改代码去支持MinGW。
?
二、使用libmysql(MySQL的C客户端)
官方没有直接给.a,要么在网上找,要么用reimp和dlltool生成,要么就直接把.lib当.o来用。
方法一:生成.exe时用现成的libmysql.a,然后使用-l编译。
例如$(CC) -o main.exe main.o -L.
-lmysql
?libmysql.a下载请参考:
?http://blog.yam.com/jasonching58/article/25478748
?http://seefromus.com/browse.php?u=ff0e598c86b9f79e4T2lNamQzZDNMbTl3Wlc1M1pXSnpjR2xrWlhJdWIzSm5MMlJ2WTNWdFpXNTBZWFJwYjI0dmFHOTNMWFJ2TFd4cGJtc3RiR2xpYlhsemNXeHNhV0l0ZDJsMGFDMWtaWFl0WXkxdmNpMW5ZMk10ZFc1a1pYSXRkMmx1Wkc5M2N5OD0%3D&b=29
?
你也可以自己生成libmysql.a,不过要用到reimp(需要单独去sourceforge下载),而且可能会不成功(我试了很多次都不行)。
?
另外你需要自己找include目录(重新安装,选择自定义安装,然后勾选全部,装完后拷贝myssql目录下的include,然后-I指定)。
方法二:取安装包里的include和lib目录
?或者官方网站上的Connector/C
?http://dev.mysql.com/downloads/connector/c/
?
然后把.lib与.o文件一起gcc即可
下面是方法二的Makefile
?
?
CC = gcc CFLAGS = -g -I./include/ all: main.exe main.exe: main.o $(CC) -o main.exe main.o libmysql.lib main.o: main.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o main.exe *.a
?
?
其实还有一种(错误的)方法,把STDCALL宏中的__stdcall去掉,然后用.dll与.o一起gcc,
不过发现会在读sql时崩
溃,估计是出现脏指针。对于写操作倒是没问题的(没有用脏指针)
?
下面是我测试用的main.c,来源于
http://www.cnblogs.com/linbc/archive/2009/06/15/1503924.html
?
?
/* * main.c * * Created on: 2010-8-2 * Author: Administrator */ #ifndef MAIN_H_ #define MAIN_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> //#include <my_global.h> #include <mysql.h> static char *opt_host_name = "localhost"; static char *opt_user_name = "root"; static char *opt_password = "123456"; static unsigned int opt_port_num = 3306; static char *opt_socket_name = NULL; static char *opt_db_name = "test"; static unsigned int opt_flags = 0; static MYSQL *conn; void print_error(MYSQL *conn, const char *title){ fprintf(stderr,"%s:/nError %u (%s)/n",title,mysql_errno(conn),mysql_error(conn)); } void process_result_set(MYSQL *conn,MYSQL_RES *res_set){ far MYSQL_ROW row; unsigned int i; while ((row = mysql_fetch_row(res_set)) != NULL){ for(i=0;i<mysql_num_fields(res_set);i++){ if (i > 0) fputc('/t',stdout); row[i] = row[i]; printf("%1s",row[i] != NULL ? row[i] : "NULL"); } fputc('/n',stdout); } if(mysql_errno(conn) != 0) print_error(conn,"mysql_fetch_row() failed"); else printf("%lu rows returned /n", (unsigned long)mysql_num_rows(res_set)); } int main(int argc, _TCHAR* argv[]) { if( (conn = mysql_init(NULL))== NULL){ fprintf(stderr,"mysql 初始化失败(可能是内存溢出)!/n"); exit(1); } if(mysql_real_connect(conn,opt_host_name,opt_user_name,opt_password, opt_db_name,opt_port_num,opt_socket_name,opt_flags) == NULL){ fprintf(stderr,"mysql_real_connect 失败:/nError %u (%s)/n", mysql_errno(conn),mysql_error(conn)); mysql_close(conn); exit(1); } if(mysql_query(conn,"insert into t (num, date) values (0, now());")){ print_error(conn,"执行插入失败"); }else{ printf("插入成功,受影响行数:%lu/n",(unsigned long)mysql_affected_rows(conn)); } if(mysql_query(conn,"select * from t")){ print_error(conn,"mysql_query() error"); }else{ MYSQL_RES *res_set; res_set = mysql_store_result(conn); /**//*生成结果集*/ if(res_set == NULL) print_error(conn,"mysql_store_result failed"); else { process_result_set(conn,res_set); mysql_free_result(res_set); } } /**//*断开*/ mysql_close(conn); getchar(); return 0; } #endif
?
?
#include <my_global.h>会造成很多警告,我把它注释了,但官方说最好加上,
#include
<windows.h>是为了避免找不到winsock的定义(老问题了)
?
?
?
?
?
(后续,待修改)
?
?
?
?
?
?
?
?
?
?
相关文章推荐
- 我的Firefox插件开发之旅(6)——FF插件的一些基础知识(转载)
- 转载 [置顶] 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
- 转载-Android开发网上的一些重要知识点3
- GE的EID项目要我过去做mx21开发。以后会陆续写一些经历(当然不会涉及保密)
- VC6.0开发中一些链接错误的解决方法
- Windows下用eclipse和mingw开发C/C++的开发环境搭建(转载)
- ios开发一些有用的链接(不定期更新)
- 分享我对JS插件开发的一些感想和心得
- [转载]Android开发网上的一些重要知识点
- C#开发微信公众平台-就这么简单(转载)(附原文链接)
- 转载----开发运维资产管理系统cmdb一些观点扯淡
- 【转载】分享一些FLASH开发时用到的工具~
- 【转载】《Flexpaper二次开发入门教程》(十九) Flexpaper二次开发的一些常见错误及解决(5.7节 ...
- 自学 iOS 开发的一些经验(一些很好的链接)
- ios UI开发相关转载链接汇总
- [转载]基于PDIUSBD12的USB通讯开发的一些经验
- 【转载内容】iOS IM开发的一些开源、框架和教程等资料
- Milo的游戏开发的一些链接资料
- 【转载】计算机视觉领域的一些牛人博客,研究机构等的网站链接
- javascript插件开发的一些感想和心得