Ubuntu下cross mingw编译GCC,找不到windows.h

老邓 2009-05-22 09:38:59
我安装cross mingw编译器,将rpm转换成了deb并安装成功:
fakeroot alien -d *.rpm
sudo dpkg -i *.deb

编译测试程序:
#include <windows.h> 

int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd)
{
MessageBoxW (NULL, L"Hello World!", L"hello", MB_OK | MB_ICONINFORMATION);
return 0;
}

编译,运行,也成功!
loaden@qpsoft:~$ i686-pc-mingw32-gcc main.cpp -o hello.exe -mwindows
loaden@qpsoft:~$ file ./hello.exe
./hello.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

于是我编译gcc,首先编译gmp和mpfr,都成功了。
方法:
一、编译gmp
../../src/gmp/configure --host=i686-pc-mingw32 --build=mingw32 --disable-shared
make
sudo make install
二、编译mpfr
../../src/mpfr/configure --host=i686-pc-mingw32 --build=mingw32 --with-gmp=/usr/local --disable-shared

make
sudo make install

然而,当我编译GCC时,却出现了找不到头文件windows.h的问题!

错误信息的一部分:
../../../../src/gcc/libiberty/pex-win32.c:24:21: 错误: windows.h:没有该文件或目录
../../../../src/gcc/libiberty/pex-win32.c:40:21: 错误: process.h:没有该文件或目录
../../../../src/gcc/libiberty/pex-win32.c:41:16: 错误: io.h:没有该文件或目录
../../../../src/gcc/libiberty/pex-win32.c: 在函数‘pex_win32_open_read’中:
../../../../src/gcc/libiberty/pex-win32.c:122: 警告: 隐式声明函数‘_open’
../../../../src/gcc/libiberty/pex-win32.c:122: 错误: ‘_O_RDONLY’未声明(在此函数内第一次使用)
../../../../src/gcc/libiberty/pex-win32.c:122: 错误: (即使在一个函数内多次出现,每个未声明的标识符在其
../../../../src/gcc/libiberty/pex-win32.c:122: 错误: 所在的函数内也只报告一次。)
../../../../src/gcc/libiberty/pex-win32.c:122: 错误: ‘_O_BINARY’未声明(在此函数内第一次使用)
../../../../src/gcc/libiberty/pex-win32.c:122: 错误: ‘_O_TEXT’未声明(在此函数内第一次使用)
../../../../src/gcc/libiberty/pex-win32.c: 在函数‘pex_win32_open_write’中:
../../../../src/gcc/libiberty/pex-win32.c:134: 错误: ‘_O_WRONLY’未声明(在此函数内第一次使用)

请问如何解决呢?
我尝试过:
1. 修改CFLAGS、CPPFLAGS
2. --with-sysroot

但都失败了。
注意:我不编译gcc,只在命令行下编译是可以找到windows.h的。
请帮忙给点提示、思路。
谢谢!
...全文
6373 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
young40 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 loaden 的回复:]
引用 7 楼 hikaliv 的回复:
其实前辈……我挺糊涂的……

你好像近来一直在致力于用LINUX搞WIN的东西……为什么???各搞各的不好么……

因为我喜欢Linux,平时工作、娱乐都在Linux下。我很反感MS的垄断,所以我不用Office,也排斥用VC,现在排斥用Windows...
但我知道有些地方真的离不开Windows,比如网上银行。(有个IE4Linux,可能只是暂可替代)
可我又得写共享软件卖钱,而共享软件只能在Windows...
唉,走火入魔了...

看到神七升天时,有台计算机用的是Debian系统,心里真欣慰...如果全国人民都用Linux...
其实,Ubuntu 9.04真的很好用!

[/Quote]




那里有个Debian?我怎么没有看到?
szy41 2009-06-23
  • 打赏
  • 举报
回复
mark
老邓 2009-05-23
  • 打赏
  • 举报
回复
出现新的问题了!

make[2]: 正在进入目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3'
Making all in include
make[3]: 正在进入目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include'
make[3]: 没有什么可以做的为 `all'。
make[3]:正在离开目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include'
Making all in libsupc++
make[3]: 正在进入目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/libsupc++'
/bin/bash ../libtool --tag CC --tag disable-shared --mode=compile mingw32-cc -L/home/loaden/mingw/obj/gcc/mingw32/winsup/mingw -L/home/loaden/mingw/obj/gcc/mingw32/winsup/w32api/lib -isystem /home/loaden/mingw/src/gcc/winsup/mingw/include -isystem /home/loaden/mingw/src/gcc/winsup/w32api/include -DHAVE_CONFIG_H -I.. -I/home/loaden/mingw/src/gcc/libstdc++-v3/../libiberty -I/home/loaden/mingw/src/gcc/libstdc++-v3/../include -I/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include/mingw32 -I/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include -I/home/loaden/mingw/src/gcc/libstdc++-v3/libsupc++ -I/mingw/include -g -O2 -DIN_GLIBCPP_V3 -Wno-error -c cp-demangle.c
../libtool: line 1829: cygpath: command not found
libtool: compile: mingw32-cc -L/home/loaden/mingw/obj/gcc/mingw32/winsup/mingw -L/home/loaden/mingw/obj/gcc/mingw32/winsup/w32api/lib -isystem /home/loaden/mingw/src/gcc/winsup/mingw/include -isystem /home/loaden/mingw/src/gcc/winsup/w32api/include -DHAVE_CONFIG_H -I.. -I/home/loaden/mingw/src/gcc/libstdc++-v3/../libiberty -I/home/loaden/mingw/src/gcc/libstdc++-v3/../include -I/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include/mingw32 -I/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/include -I/home/loaden/mingw/src/gcc/libstdc++-v3/libsupc++ -I/mingw/include -g -O2 -DIN_GLIBCPP_V3 -Wno-error -c "" -o cp-demangle.o
mingw32-cc: : No such file or directory
mingw32-cc: no input files

make[3]: *** [cp-demangle.lo] 错误 1
make[3]:正在离开目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3/libsupc++'
make[2]: *** [all-recursive] 错误 1
make[2]:正在离开目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3'
make[1]: *** [all] 错误 2
make[1]:正在离开目录 `/home/loaden/mingw/obj/gcc/mingw32/libstdc++-v3'
make: *** [all-target-libstdc++-v3] 错误 2

晕了,怎么和cygwin扯上关系了?

老邓 2009-05-23
  • 打赏
  • 举报
回复
终于不是上次莫名其妙的错误了,真激动!!
看来要成功了!


错误信息如下:
mingw32-gcc -L/home/loaden/mingw/obj/gcc/mingw32/winsup/mingw -L/home/loaden/mingw/obj/gcc/mingw32/winsup/w32api/lib -isystem /home/loaden/mingw/src/gcc/winsup/mingw/include -isystem /home/loaden/mingw/src/gcc/winsup/w32api/include -dumpspecs > tmp-specs
/bin/bash: mingw32-gcc:找不到命令
make[1]: *** [specs] 错误 127
make[1]:正在离开目录 `/home/loaden/mingw/obj/gcc/gcc'
make: *** [all-gcc] 错误 2
老邓 2009-05-23
  • 打赏
  • 举报
回复
看来是因为我没掌握交叉编译的原因。
下面是今天修正的编译方式,正在编译中,obj目录已经200MB了,不知道又要出来什么错误信息:只要不像上次那样一点头绪都没有就行!

、编译gmp
../../src/gmp/configure --host=i686-pc-mingw32 --build=i686-pc-linux-gnu --disable-shared
make
sudo make install

二、编译mpfr
../../src/mpfr/configure --host=i686-pc-mingw32 --build=i686-pc-linux-gnu --with-gmp=/usr/local --disable-shared

make
sudo make install

三、编译gcc
../../src/gcc/configure --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 --disable-nls --disable-shared --disable-werror --disable-symvers --disable-libstdcxx-pch --disable-win32-registry --disable-sjlj-exceptions --with-gmp=/usr/local --with-mpfr=/usr/local --with-pkgversion='qp mingw32' --with-bugurl=http://www.qpsoft.com/blog/guestbook.php --host=i686-pc-mingw32 --build=i686-pc-linux-gnu --target=mingw32 --prefix=/mingw
make all-gcc all-target-libstdc++-v3 all-target-libssp all-target-libgcc
make install-gcc install-target-libstdc++-v3 install-target-libssp install-target-libgcc

明白了一点:host和build不同,才是交叉编译!
光宇广贞 2009-05-23
  • 打赏
  • 举报
回复
支持一下……尽管……其实很辛苦的……
老邓 2009-05-23
  • 打赏
  • 举报
回复
我先结帖吧。
我刚才测试在Linux下编译的GCC,还是不搜索include目录。
本来还想尝试cygwin下编译的。
不过看来和纯Linux是一样的。
通过这段经历告诉我:GCC真的很强大。
在Linux下编译Windows软件,而且可以利用wine来调试...
感觉很好。
在跨平台和对x64支持上,我还是先偏向于跨平台吧。
毕竟自己经常在Linux下工作与学习。
老邓 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hikaliv 的回复:]
Are you sure your entire compiler is up to date, not just the library? And the
build and install directories are clean? Because your first lines of failure
involve bits of the library which *require* a consistent simultaneous change in
the C++ front-end, and well, nobody is experiencing similar problems anywhere.
Not that this code is target-independent.

CC-ing Jason, the author of s…
[/Quote]
是他又发现了新的问题,但之前的问题从他的错误信息看是解决了。
非常感谢抽出时间翻译,谢谢!
光宇广贞 2009-05-23
  • 打赏
  • 举报
回复
Are you sure your entire compiler is up to date, not just the library? And the
build and install directories are clean? Because your first lines of failure
involve bits of the library which *require* a consistent simultaneous change in
the C++ front-end, and well, nobody is experiencing similar problems anywhere.
Not that this code is target-independent.

CC-ing Jason, the author of such code, to be sure.

首先,compiler要升级到最新版,而不仅仅是库。build和install目录要清理好。注意代码(应指的是库文件)是“目标独立target-independent”的。

Well, on 4.4 branch there was a patch introducing the winsup link, which got
necessary for building libstdc++. We solve this by setting up in gcc's source
tree a symbolic link "winsup" pointing to the sysroot (prefix) directory.

4.4版里,有一个补丁(patch)介绍了winsup link,该patch对于build那个libstdc++是必要的。我们通过在gcc源树里面设置了指向sysroot目录的符号链接(symbolic link)winsup解决了这个问题。

I move to gcc-4.4.0-20090407, create symbolik link to my prefix directory
(/usr/win64), but build not successfully..
.............
There is a possibility of manual build.. call make with these options
make -j9 CFLAGS="-g -O2 -DNULL=0" CXXFLAGS="-g -O2 -DNULL=0
and compile remaining parts of gcc from root build directory, but it is not too
convenient...


移植到gcc-4.4.0-20090407,建立符号链接指向我的prefix目录(/usr/win64),但build失败。
.......
有种可能的办法是手动build,指定选择项如-j9 CFLAGS="-g -O2 -DNULL=0" CXXFLAGS="-g -O2 -DNULL=0之类的,然后从根编译目录中compile gcc的其余部分,但此法不是很方便。

………………………………
不写了,好像最后没有解决问题……最后问的是如何打补丁……就是打那个patch……
老邓 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hikaliv 的回复:]
给楼主推荐“玄机逸士”大牛来翻译。
[/Quote]
呵呵,谢谢,已经看明白了。
只是找不到补丁。
给那些大牛们发邮件求助了,不过还没有回音。
准备用GCC 4.2去编译,看还是否出现同样问题。
光宇广贞 2009-05-23
  • 打赏
  • 举报
回复
给楼主推荐“玄机逸士”大牛来翻译。
老邓 2009-05-23
  • 打赏
  • 举报
回复
C编译器已经编译成功了。
就是C++的标准库编译出问题。

有人报告给GCC开发组,而且看起来问题已经解决:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39738
然而我却不明白winsup的link是如何做的?
另,哪里有winsup下载。我从cygwin下载其源码:不知是否是一样的东西。

我英文不好,英文好的朋友能否帮我看看这个链接:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39738翻译一下里面是如何解决问题的。我看了半天,还是模模糊糊。
claro 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chenzhp 的回复:]
支持一下楼主
[/Quote]
光宇广贞 2009-05-23
  • 打赏
  • 举报
回复
……交叉编译……
老邓 2009-05-22
  • 打赏
  • 举报
回复
如果直接make,则obj目录下已经编译出468MB的文件,我看到cc1.exe已经编译出来了,还有collect2.exe、cpp.exe等
可,我现在碰到的到底是什么错误啊?
相信我离成功其实只有一步之遥,可努力了2小时了,还是无法解决。
老邓 2009-05-22
  • 打赏
  • 举报
回复
--build=i686-pc-mingw32
这样设置,没有找不到windows.h头文件的问题了。
然而,即使是make all-gcc也无法通过:
i686-pc-mingw32-gcc -g -O2 -D__USE_MINGW_ACCESS -Wl,--stack,8388608 -o applyfix.exe fixfixes.o fixlib.o fixopts.o ../libiberty/libiberty.a
srcdir="../../../src/gcc/fixincludes" /bin/bash ../../../src/gcc/fixincludes/mkfixinc.sh i686-pc-mingw32
sed -e 's/@gcc_version@/4.4.1/' < mkheaders.almost > mkheadersT
mv -f mkheadersT mkheaders
make[1]:正在离开目录 `/home/loaden/mingw/obj/gcc/fixincludes'
make[1]: 正在进入目录 `/home/loaden/mingw/obj/gcc/gcc'
/home/loaden/mingw/obj/gcc/./gcc/xgcc -B/home/loaden/mingw/obj/gcc/./gcc/ -L/home/loaden/mingw/obj/gcc/i686-pc-mingw32/winsup/mingw -L/home/loaden/mingw/obj/gcc/i686-pc-mingw32/winsup/w32api/lib -isystem /home/loaden/mingw/src/gcc/winsup/mingw/include -isystem /home/loaden/mingw/src/gcc/winsup/w32api/include -B/mingw/i686-pc-mingw32/bin/ -B/mingw/i686-pc-mingw32/lib/ -isystem /mingw/i686-pc-mingw32/include -isystem /mingw/i686-pc-mingw32/sys-include -dumpspecs > tmp-specs
/bin/bash: /home/loaden/mingw/obj/gcc/./gcc/xgcc: 没有该文件或目录
make[1]: *** [specs] 错误 127
make[1]:正在离开目录 `/home/loaden/mingw/obj/gcc/gcc'
make: *** [all-gcc] 错误 2

能否帮忙找一下原因呢?
chenzhp 2009-05-22
  • 打赏
  • 举报
回复
支持一下楼主
老邓 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwoo_1105 的回复:]
ubuntu下哪有windows.h啊
[/Quote]
我使用交叉编译器:cross mingw,在Linux下编译Windows程序!
现在我是在编译在Windows下使用的MinGW编译器。
wwoo_1105 2009-05-22
  • 打赏
  • 举报
回复
ubuntu下哪有windows.h啊
goodname 2009-05-22
  • 打赏
  • 举报
回复
机密的东西不会接到互联网上的,用用windows也未尝不可。
加载更多回复(5)
MyQQ is a cross-platform library for communication which uses a TencentQQ-like protocol to communicate with friends on the Internet. It can work well now and maintained by Xiaoxia (gdxxhg@gmail.com). If you are interested in MyQQ and have improved it, I suggest you that you send your source code to me then everyone will know your work and thank you! You can get the latest version of this software (including its source code) at http://home.xxsyzx.com 注意:本软件以及源代码仅供学习研究使用。所用协议皆属个人业余的黑匣分析结果。 Developer List: 小虾 (gdxxhg@gmail.com) 千月(改进myqq.c界面) ccpaging Windows编译: 需要Mingw32(Devcpp的bin也可以)。 打开控制台,在当前目录下执行 make -C src clean all Linux编译: 在终端里执行 make -C src -flinux.mak clean all MacOSX编译: 在终端里执行 make -C src -fmac.mak clean all 由于最初没有周全考虑,目前版本暂时不兼容64位的机器,望见谅! Update History: Version 3.17 (2009-6-30) 1. 修正发送消息后头像的变化。 2. 修正09SP1接收信息的bug。 3. 修正0x18包中获取好友失败时的内存访问错误。 4. 修正09SP1系统消息协议。 5. 盲目修正09接收消息的bug。 6. 增加qqconn.c,支持代理登录。 Version 3.16 (2009-6-27) 1. 增加NoColor配置项关闭色彩文字。 2. 增加cls/clear/clrscr命令来清屏。 3. 提示消息发送失败,但不具体。 Version 3.15 (2009-6-24) 1. 增加qqclient_detach()。 2. 编写成libqq,供外部程序调用。 Version 3.14 (2009-6-21) 1. 命令行参数方式登录失败后的死循环。 2. 内核使用QQ2009SP1协议。 3. 修正08之前接收消息的bug。 4. 兼容Mac32。 5. utf8.c里添加qqdef.h头文件。 Version 3.13 (2009-3-29) 1. Linux(Ubuntu) version compiled! Version 3.12 (2009-3-22) 1. 用Windows的Sleep代替不推荐的_sleep。 2. 在Mingw32-gcc4.3.3上编译成功。 Version 3.11 (2009-2-8) 1. 输入验证码提示。 2. 修正myqq.c删除好友的bug。 3. 修正添加附言的bug。 Version 3.10 (2009-2-7) 1. 修正09接收消息协议。 2. 全部源代码文件更改为UNIX-UTF8格式。 3. 增加Preference来自定义屏蔽部分协议。 4. 增加添加、删除好友基本协议,支持验证码。 5. 登录后更改状态。 6. 登录机器数据随机填充。 7. 修正myqq.c里无法打印某些消息的bug。 Version 3.08 (2009-1-27) 1. 修正myqq.c里显示好友状态。 2. 修正因缺少pthread_mutex_destroy引起的资源泄漏(可以检测到)。 3. 修正好友数目多时导致分组信息与群信息未能获取的问题。 4. 10分钟刷新群在线成员。 5. 自动建立qqconfig.txt配置文件。 Version 3.03 (2009-1-26) 1. 修正prot_im.c中buf->pos += get_word( buf );在Linux上运行时发生的错误。 2. 编译Linux版本。 3. qqconfig.txt缺失提示。 Version 3.00 (2009-1-25) 1. 更换QQ2008贺岁版协议为QQ2009Preview4协议。 2. 全面使用utf8,myqq.c为Windows用户转换为gb。 3. 移除所有多余,功能不确切的协议处理函数。 4. 能够接收08,09协议的好友消息与群消息。 5. 处理消息中的表情字符,转换成[face:*]以及[image]来表示。 Version 2.95 (2008-10-26) 1. 处理返回NULL的可能。 2. 服务器列表由配置文件导入。 Version 2.9 (2008-10-1) 1. 支持字符颜色显示。 2. 中文字符界面。 3. 补充了几个新的服务器IP。 4. 输入密码时去掉回显或打*。 5. 修正prot_login_verify_password_reply处理返回包的误解,感谢CC-Akita(CCPaging)。 6. 增加Dev-cpp工程文件,增加程序图标。 7. Makefile里定向pthread库,便于不同环境的编译。 Version 2.8 (2008-8-3) 1. Linux Build Support. Version 2.7 (2008-8-2) 1. 使用上次登录IP,加快多Q登录速度。 2. 修正list.c里添加项在满时没有返回<0的漏洞。 3. 在登录未完成时,不接收消息。 Version 2.6 (2008-7-27) 1. 登录中的未知字节用0填充,原来是用随机数。 2. 根据文档,进一步完善登录协议,但还是没有解决验证码的出现问题。 Version 2.5 (2008-7-26) 1. 修正一个发包的bug,包被送进已发送队列之后time_alive应该为当前时间。之前因为 这个问题,导致一个包超时其他包也要重发? 2. 恢复注销命令(没有这个,怎么下线呢)。 3. 登录首先获取所有钥匙,避免出现登录后被Kick out。 4. 感谢网友008的提醒,号码格式化字符%d已被替换为%u。 Version 2.4 (2008-7-24) 1. 好友添加。 2. Packed with pthread library. 3. 删除注销命令(可能引发异常) 4. 重发时长为6秒 Version 2.3 (2008-7-22) New features: 1. 支持UDP协议登录。 2. 调整了登录后的发包次序。 3. 好友使用qsort快排。 4. 完善了event的缓冲区,和以前的webqq结合使用。 5. 使用assert函数,便于精简发布版本的代码。 Version 2.0 (2008-7-17) New featrues: 1. 包管理器的链表改用loop数据结构,精简代码,减少错误。 2. (--a)%b可能为负数,原来没注意到,引发了改写mcb的内存错误。 3. 发包序号策略改善,不再每次发包都递增。 Version 1.9 (2008-7-15) New features: 1. 重新策划程序,采用QQ2008贺岁版协议。 2. 原来的group改名为qun,原group被用作管理好友分租。 3. 增加memory.c内存管理和debug.c调试信息及日志记录。 4. ccpaging建议改掉qqqun这个结构名,我打算下个版本把它改为qun_t,其它类似如 member_t, group_t, buddy_t。 5. 具备登录输入验证码功能,验证码图片保存在web/verify目录下。 6. 修正qqsocket里接收数据溢出。 Version 0.9 (2008-2-12) New features: 1. MyQQ库可以登录多个ID,API全部更新。 2. 修正好友名称里混有QQ号码和特殊字符。 3. 完善了好友状态回调。 4. 延长了重发包的时间,避免发送两次。 5. 修正在自动回复时控制台提示的问题。 6. 回调函数全部使用stdcall模式。 Version 0.6 (2008-2-5) New features: 1. Wait for message to send. 2. Improve input. 3. Check for repeated messages. 4. Add refresh command. Version 0.5 (2008-2-4) New features: 1. Send message to group. 2. Get group list. 3. List groups, online users and online group members. 4. Get group member information. 5. Get buddy information. 6. The original interface works. Version 0.1 (2008-2-1) Use QQ2006 Protocol to login. Support Receiving messages from buddies and groups, sending messages to buddies. Compiled and linked on Linux(GCC 4.1, Debian etch). Compiled and linked on Windows(MingwGCC 3.4.2).

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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