Ubuntu交叉编译libcmaes生成Windows exe遇链接错误求助
解决Ubuntu交叉编译libcmaes生成Windows .exe的链接错误问题
首先,你遇到的核心问题是链接的libcmaes库不是针对Windows交叉编译的——本地用g++编译的库是Linux ELF格式,而x86_64-w64-mingw32-g++需要Windows PE格式的库,因此会出现未定义引用错误。以下是具体解决步骤:
1. 交叉编译libcmaes库
你需要先针对Windows平台重新编译libcmaes,而不是直接使用Ubuntu下编译好的版本:
# 克隆libcmaes源码(如果还没下载) git clone https://github.com/beniz/libcmaes.git cd libcmaes # 创建交叉编译专用的构建目录 mkdir build-mingw && cd build-mingw # 用cmake配置交叉编译环境 cmake .. \ -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc \ -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ \ -DCMAKE_SYSTEM_NAME=Windows \ -DBUILD_SHARED_LIBS=OFF # 选择静态库(避免Windows上需要额外的dll),如果需要动态库改为ON # 编译并安装库 make -j$(nproc) sudo make install
安装完成后,库文件会被放到/usr/x86_64-w64-mingw32/lib,头文件在/usr/x86_64-w64-mingw32/include(默认路径)。
2. 编译你的测试代码
现在用交叉编译器编译你的代码,并链接刚编译好的Windows版libcmaes库:
x86_64-w64-mingw32-g++ -o test.exe test.cpp -I/usr/x86_64-w64-mingw32/include -L/usr/x86_64-w64-mingw32/lib -lcmaes
如果你自定义了安装路径,替换-I和-L后的路径即可。
3. 额外检查点
- 确保libcmaes编译时启用了模板实例化:有些C++库需要显式实例化模板才能被交叉编译器链接到。如果仍有错误,可以在cmake配置时添加
-DENABLE_TEMPLATE_INSTANCES=ON(libcmaes的cmake选项支持这个)。 - 测试运行:编译生成的
test.exe可以用wine test.exe在Ubuntu中测试,或者复制到Windows系统直接运行(如果用动态库,需要把对应的libcmaes.dll一起复制过去)。
内容的提问来源于stack exchange,提问作者hichus
相关产品推荐
相关产品推荐

