从Linux交叉编译生成32位Windows可执行文件的问题求助
解决交叉编译Tandem到32位Windows时的Expat链接错误
你遇到的是交叉编译里典型的平台库不匹配问题:当前你链接的是Linux x86_64版本的libexpat.a,但目标是生成32位Windows可执行文件,必须使用MinGW-w64提供的Windows平台Expat库,系统自带的Linux库符号和Windows平台不兼容,这才导致了undefined reference to XML_ParserCreate这类链接错误。
下面是具体的修复步骤:
1. 安装MinGW-w64版本的Expat库
首先要安装针对32位Windows交叉编译的Expat开发包,在Debian/Ubuntu系统里执行:
sudo apt-get install i686-w64-mingw32-expat
这个包会提供适配Windows平台的Expat头文件和静态/动态库,交叉编译器能自动识别并调用。
2. 修正Makefile中的链接参数
你的LDFLAGS配置存在两个关键问题:
-L/usr/lib/x86_64-linux-gnu/libexpat.a用法错误:-L后面应该跟库目录路径,而非具体的库文件;- 指向了Linux系统的库,而非MinGW适配Windows的库。
把LDFLAGS修改为:
LDFLAGS = -lpthread -lm -lexpat
MinGW交叉编译器会自动从默认路径(比如/usr/i686-w64-mingw32/lib/)找到正确的Windows版本libexpat.a,无需手动指定-L路径,除非你把库安装在了非默认位置。
另外,确保CXX变量指向标准的交叉编译器:
CXX = /usr/bin/i686-w64-mingw32-g++
(i686-w64-mingw32-g++-win32是别名,直接用标准命名更稳妥)
3. 恢复源码的原始头文件引用
你之前手动添加#include的做法确实不规范,安装MinGW版本的Expat库后,交叉编译器会自动从它的头文件路径(/usr/i686-w64-mingw32/include/)找到Expat的头文件,所以可以移除那些手动添加的引用,恢复源码原本的状态。
4. 重新编译
先清理之前的编译产物,再重新执行编译:
sudo make -f Makefile_ubuntu clean sudo make -f Makefile_ubuntu
额外提示
- 如果需要生成不依赖外部DLL的独立可执行文件,可以在
LDFLAGS中添加-static参数:LDFLAGS = -static -lpthread -lm -lexpat - 检查
CXXFLAGS里的-std=gnu++11是否符合项目要求,Tandem源码可能需要特定的C++标准,可以参考原始Makefile的注释调整。
内容的提问来源于stack exchange,提问作者jeemar
相关产品推荐
相关产品推荐

