您的位置:首页 > 其它

(转载)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的定义(老问题了)

?

?

?

?

?

(后续,待修改)

?

?

?

?

?

?

?

?

?

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: