(转载)MinGW开发的经历感想和一些链接

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

?

?

?

?

?

(后续,待修改)

?

?

?

?

?

?

?

?

?

?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值