发布MinGW QP 4.4.3-4,集成官方与TDM优点,交叉编译

老邓 2010-03-02 05:03:29
官方4.4.0的缺点:
1. 头文件不能下断点;
2. 跨模块(DLL)不能catch exception调试
官方4.4.0的优点:
1. 对dw-2异常处理做了完善
2. 对Windows平台的SEH处理进行了完善

MinGW TDM 4.4.1版本的优点:
1. 头文件可以下断点
2. 可以跨模块(DLL)catch exception调试
3. 支持大文件
4. 支持-std=c++0x选项,修正__STRICT_ANSI__后的编译错误
5. stack扩充到32MB
6. 其他,我解释不了的修正
MinGW TDM 4.4.1版本的缺点:
1. 官方版本的优点它没有

另,TDM和官方都有的缺点是:版本更新比较落后,目前GCC已经发布4.4.3了...
且,TDM和官方版本都在cygwin模拟环境下编译,需要针对编译环境打补丁。

为了集成这两个版本的优点,克服他们的缺点,我有了在Linux平台交叉编译4.4.3的想法,并且集成官方和TDM的所有优点,克服他们的所有缺点!

MinGW QP版本的优点:
1. 官方4.4.0的所有优点
2. TDM4.4.1版本的所有优点
MinGW QP版本的缺点:
不详,有待实践检验。欢迎使用,本人已用此编译器编译了wxWidgets2.8.10、Qt4.6.2、Code::Blocks、boost1.4.2,经测试无误,所有优点集成成功后才发布。

完整版,集成了mingw32-4.4.3-4-all cross build with archlinux (binutils-2.20.1-2,gdb-7.0.50,make-3.81,mingwrt-3.18,w32api-3.14,pthreads2.8,iconv_1.13.1,解压后即可使用。
下载地址:http://qp-gcc.googlecode.com/files/mingw32-4.4.3-4-all.7z

仅gcc_g++编译器:http://qp-gcc.googlecode.com/files/gcc_g%2B%2B-4.4.3-4.7z

附上我探索15天的交叉编译方法:

交叉编译核心参数解释:
--build = 软件在什么平台下编译
--host = 软件在什么平台下运行
--target = 软件为什么平台服务(仅限开发工具链)
host = 后面的参数是四个部分:
架构-厂商-内核-标准库
例如 arm-generic-linux-gnu 表示 arm 架构,generic 厂商,linux内核,gnu glibc 标准库。

交叉编译器与target一致,比如去掉前面的i486-前缀,可以通过链接来实现,也可以自己编译。
cd /usr/bin
su
for files in i486-mingw32-*; do ln -s $files ${files:5}; done
exit


一、编译gmp
DIR=/home/loaden/AUR/mingw32
ABI=32 ../../src/gmp-5.0.1/configure \
--host=mingw32 \
--target=mingw32 \
--build=i686-pc-linux-gnu \
--enable-cxx \
--disable-static \
--enable-shared
make && make install prefix=$DIR/gmp && mingw32-strip $DIR/gmp/bin/*

二、编译mpfr
--with-gmp是必须的,否则无法生成DLL!
DIR=/home/loaden/AUR/mingw32
../../src/mpfr-2.4.2/configure \
--host=mingw32 \
--target=mingw32 \
--build=i686-pc-linux-gnu \
--with-gmp=$DIR/gmp \
--disable-static \
--enable-shared
make && make install prefix=$DIR/mpfr && mingw32-strip $DIR/mpfr/bin/*


三、编译gcc
# 给GCC源码打上补丁(在源码目录下执行)
for files in ../patches/gcc*; do patch -p0 < $files; done
# 在/mingw内建立链接(在编译目录下执行:可拷贝下列命令后同时执行)
sudo mkdir /mingw
sudo ln -s /usr/mingw32/include/ /mingw/include
sudo ln -s /usr/mingw32/lib/ /mingw/lib
# 定义变量
DIR=/home/loaden/AUR/mingw32
GCC_VER=4.4.3
# 为libgomp配置pthread路径
mkdir -p ./mingw32/libgomp
echo \
CFLAGS=\"-I$DIR/pthreads/include -O2 -mthreads -D__USE_MINGW_ACCESS\"$'\n'\
LDFLAGS=\"-L$DIR/pthreads/lib\"$'\n'\
> ./mingw32/libgomp/config.cache
# 导出环境变量
export C_INCLUDE_PATH="$DIR/pthreads/include"
export CPLUS_INCLUDE_PATH="$DIR/pthreads/include"
export LIBRARY_PATH="$DIR/pthreads/lib"
export LD_LIBRARY_PATH="$DIR/pthreads/bin"
export CFLAGS="-I$DIR/pthreads/include -O2 -D__USE_MINGW_ACCESS"
export BOOT_CFLAGS="-O2 -D__USE_MINGW_ACCESS"
export CFLAGS_FOR_TARGET="-O2 -D__USE_MINGW_ACCESS"
export CXXFLAGS="-I$DIR/pthreads/include -mthreads -O2 -D__USE_MINGW_ACCESS"
export BOOT_CXXFLAGS="-mthreads -O2 -D__USE_MINGW_ACCESS"
export CXXFLAGS_FOR_TARGET="-mthreads -O2 -D__USE_MINGW_ACCESS"
export LDFLAGS="-s" BOOT_LDFLAGS="-s"
export LDFLAGS_FOR_TARGET="-L$DIR/pthreads/lib -s"
# 配置
../../src/gcc-$GCC_VER/configure \
--prefix=/mingw \
--host=mingw32 \
--target=mingw32 \
--build=i686-pc-linux-gnu \
--enable-languages=c,c++ \
--enable-cxx-flags='-fno-function-sections -fno-data-sections' \
--enable-fully-dynamic-string \
--enable-version-specific-runtime-libs \
--enable-threads=win32 \
--enable-libgomp \
--disable-nls \
--disable-libstdcxx-pch \
--disable-win32-registry \
--disable-sjlj-exceptions \
--with-dwarf2 \
--with-gmp=$DIR/gmp \
--with-mpfr=$DIR/mpfr \
--with-pkgversion='QP MinGW32' \
--with-bugurl=http://www.qpsoft.com/blog/guestbook.php
make
# -Wl,...: 告诉GCC传递后面的选项给liker链接器
# 加入--stack=0x2000000把stack设为32MB,解决可能的stack overflow。
rm -f gcc/cc1.exe gcc/cc1plus.exe
make install DESTDIR=$DIR LDFLAGS="-s -Wl,--stack=0x2000000"

...全文
2488 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
sstower 2012-02-01
  • 打赏
  • 举报
回复
不错不错
MKNDG 2011-05-27
  • 打赏
  • 举报
回复
up
这个得支持一下。
fdb713 2011-02-13
  • 打赏
  • 举报
回复
虽然是坟但是……我要挖!!感谢楼主为我解决了WxWidgets2.8.11编译不能的问题!!!
老邓 2010-03-15
  • 打赏
  • 举报
回复
取消推荐,结帖!
感谢支持!
STONE86 2010-03-14
  • 打赏
  • 举报
回复
支持一下楼主
三哥自尊心强 2010-03-14
  • 打赏
  • 举报
回复
支持。
据说open Watcom 更高效一些。
hu_haitao 2010-03-13
  • 打赏
  • 举报
回复
这个得支持一下。
lu4462199 2010-03-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ithurricane 的回复:]
支持大牛啊~~~~
~~~~~~~~~~~
[/Quote]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
weiyuan614 2010-03-13
  • 打赏
  • 举报
回复
这东西还可以
ilovechao1314 2010-03-12
  • 打赏
  • 举报
回复
mark~~~~~~~~~~~~~~~~~~~~~~
theoneluck 2010-03-12
  • 打赏
  • 举报
回复
对STL并不懂,学习了。
macklau 2010-03-12
  • 打赏
  • 举报
回复
学习了,多发着方面的贴就好了,谢谢
老邓 2010-03-12
  • 打赏
  • 举报
回复
晕倒,错误信息里有这一句,我刚才没细看:
libtool: link: (cd ".libs" && rm -f "libgomp.lib" && ln -s "libgomp-1.dll" "libgomp.lib")

原来,libgomp.lib是存在的,但被强制删除了。
并且同时做了一个指向libgomp-1.dll的链接。

没有办法,我被迫手动改了mingw32/libgomp/libtool这个文件,看起来这是用来生成lib的。
我将.lib全部改成了.dll.a

再编译,竟然通过了。
看来生成了正确的libgomp.lib了。
老邓 2010-03-12
  • 打赏
  • 举报
回复
Creating library file: .libs/libgomp-1.dll
libtool: link: (cd ".libs" && rm -f "libgomp.lib" && ln -s "libgomp-1.dll" "libgomp.lib")
libtool: link: /usr/lib/gcc/mingw32/4.4.3/../../../../mingw32/bin/ar rc .libs/libgomp.lib alloc.o barrier.o critical.o env.o error.o iter.o iter_ull.o loop.o loop_ull.o ordered.o parallel.o sections.o single.o task.o team.o work.o lock.o mutex.o proc.o sem.o bar.o ptrlock.o time.o fortran.o affinity.o
/usr/lib/gcc/mingw32/4.4.3/../../../../mingw32/bin/ar: .libs/libgomp.lib: File format not recognized
make[4]: *** [libgomp.la] 错误 1
make[4]: Leaving directory `/home/loaden/AUR/mingw32/build/gcc-4.4.3/mingw32/libgomp'
make[3]: *** [all-recursive] 错误 1
make[3]: Leaving directory `/home/loaden/AUR/mingw32/build/gcc-4.4.3/mingw32/libgomp'
make[2]: *** [all] 错误 2
make[2]: Leaving directory `/home/loaden/AUR/mingw32/build/gcc-4.4.3/mingw32/libgomp'
make[1]: *** [all-target-libgomp] 错误 2
make[1]: Leaving directory `/home/loaden/AUR/mingw32/build/gcc-4.4.3'
make: *** [all] 错误 2

出现这样的错误。
看起来确实是创建dll时失败了。

此时mingw32/libgomp/.libs目录下,已经创建成功了libgomp-1.dll
同时还有一个指向libgomp-1.dll的名为libgomp.lib的链接。
说文件格式不对,自然是这个只是一个链接。
所以,我此时应该手动从dll生成一个lib。

我查了一下libtool的用法:
GNU dlltool用于需要使用动态链接库(DLLs)时。下面的选项是值得我们关注的:

-l --output-lib <outname> 生成导入库
-D --dllname <name> 指定用于生成导入库的DLL文件名
-d --input-def <deffile> 读取DEF文件
-U --add-underscore 为导入库里的元素加上下划线前缀
-k --kill-at 去除导出的名称里的@<n>

所以,标准的用法看起来是这样的:
dlltool -D sample.dll -d sample.def -l sample.a

于是我执行:
mingw32-dlltool -D libgomp-1.dll -l libgomp.lib

生成了一个libgomp.lib
不过,此时并没有libgomp-1.def,也就是说,我无法指定def文件。
不知道是否会受到影响。


老邓 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 redleaves 的回复:]
引用 46 楼 loaden 的回复:
我在交叉编译的时候,还碰到过提示文件格式不对的情况。
现在你一说,我觉得那个libgomp.lib本来应该是libgomp.dll,是这个意思吧。
那为什么会交叉编译成功了呢?

看官方介绍,libstdc++在4.5时支持静态库了。
能否介绍一下:libstdc++为什么现在不能使用静态库?

libgomp的编译过程是先编译静态版本的.再用静态版本的库生成动态库.然后根据动态库生成它的.a.错就错在最后一步.开始的时候,确实是编译出了静态版的libgomp,只不过在生成动态库的时候,被覆盖成DLL了.然后再生成导出库的时候格式不对了...你编译成功不是改了当前的编译状态文件嘛...估计就把后面的步骤跳过了.
[/Quote]
我在写入config.cache时,这个文件是空白的。
配置libgomp时,会读取这个文件中的变量。
所以,我在里面加入了CFLAGS和LDFLAGS,使得其能找到pthread的头文件和库。
我感觉这样,可能导致--enable-shared失效了。
所以,libgomp库会认为只需要静态库就可以了。

那看来只能手动编译libgomp了?
但官方版本和TDM版本在GCC的编译配置中都有一项:--enable-libgomp。
说明他们都是直接将libgomp的动态库编译出来了。

官方和TDM加的个补丁看起来只是为了和cygwin兼容。
并没有针对libgomp的专门处理。

我尝试下在编译格式出错时,手动将.a改成.dll试试。
老邓 2010-03-12
  • 打赏
  • 举报
回复
感谢redleaves的指点!!您的敏锐判断,让我修正了对libgomp库的编译。
xboy 2010-03-12
  • 打赏
  • 举报
回复
支持~~~~~~~~~~~~~
老邓 2010-03-12
  • 打赏
  • 举报
回复
关于丢失libgomp-1.dll的修正:
三、编译gcc
# 配置
../../src/gcc-4.4.3/configure \
--prefix=/mingw \
--host=mingw32 \
--target=mingw32 \
--build=i686-pc-linux-gnu \
--enable-languages=c,c++ \
--enable-shared \
--enable-cxx-flags='-fno-function-sections -fno-data-sections' \
--enable-fully-dynamic-string \
--enable-version-specific-runtime-libs \
--enable-threads=win32 \
--enable-libgomp \
--disable-nls \
--disable-libstdcxx-pch \
--disable-win32-registry \
--disable-sjlj-exceptions \
--with-dwarf2 \
--with-gmp=$DIR/gmp \
--with-mpfr=$DIR/mpfr \
--with-pkgversion='QP MinGW32' \
--with-bugurl=http://www.qpsoft.com/blog/guestbook.php
make CFLAGS="-O2 -D__USE_MINGW_ACCESS" \
BOOT_CFLAGS="-O2 -D__USE_MINGW_ACCESS" \
CFLAGS_FOR_TARGET="-I$DIR/pthreads/include -O2 -D__USE_MINGW_ACCESS" \
CXXFLAGS="-mthreads -O2 -D__USE_MINGW_ACCESS" \
BOOT_CXXFLAGS="-mthreads -O2 -D__USE_MINGW_ACCESS" \
CXXFLAGS_FOR_TARGET="-mthreads -O2 -D__USE_MINGW_ACCESS" \
LDFLAGS="-s" BOOT_LDFLAGS="-s" \
LDFLAGS_FOR_TARGET="-L$DIR/pthreads/lib -s"


# libgomp错误处理:修改mingw32/libgomp/libtool脚本,将".lib"改成".dll.a",共两处:
# 1. library_names_spec="\${libname}\`echo \${release} | \$SED -e s/[.]/-/g\`\${versuffix}\${shared_ext} \$libname.lib"
# 2. reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite:
# 之后重复上一步,即可编译成功!
老邓 2010-03-11
  • 打赏
  • 举报
回复
引用 22 楼 psusong 的回复:
我一直用gcc 4.4.3,没有发现你说的问题啊?

不知道你用的是谁编译的版本。
我以前也编译过MinGW 4.4.3,不过是用MSYS环境编译,问题较多。
强烈建议更新到此交叉编译版本。
老邓 2010-03-11
  • 打赏
  • 举报
回复
引用 8 楼 happynesslele 的回复:
别说了,编译Qt不是make不行就是找不到一些dll

我昨天下午用这个编译器编译了Qt 4.6.2.
配置方法:
configure -prefix D:\DengYC\LoveDEV\qt -debug-and-release -platform win32-g++ -shared -fast -opensource -no-qt3support -no-zlib -no-openssl -no-webkit -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -nomake examples -nomake demos -nomake translations
您的意思是?

今天上午我又编译了一次1.4.2:
bjam --build-type=complete threading=multi --libdir=".\lib" --toolset=gcc-4.4.3
加载更多回复(50)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧