在Linux下使用MinGW交叉编译时如何静态链接readline库?
问题:Fedora下MinGW交叉编译Windows程序静态链接readline失败
我开发了一个小型CLI工具,用readline()实现补全和高级编辑功能。Linux下可以通过包管理器轻松使用动态库作为依赖,但Windows系统中我希望静态链接该库,保证工具的可移植性,不用操心用户是否安装了readline DLL。
现在在Fedora Linux上用MinGW交叉编译器构建Windows版本时,静态链接libreadline.a遇到了错误,尝试的编译命令和错误信息如下:
x86_64-w64-mingw32-gcc ./*.c -Wall -l:libreadline.a <其他编译选项>
错误输出:
/usr/lib/gcc/x86_64-w64-mingw32/12.2.1/../../../../x86_64-w64-mingw32/bin/ld: /usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libreadline.a(terminal.o):(.text+0x7a3): undefined reference to `tputs' /usr/lib/gcc/x86_64-w64-mingw32/12.2.1/../../../../x86_64-w64-mingw32/bin/ld: /usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libreadline.a(terminal.o):(.text+0x1063): more undefined references to `tputs' follow /usr/lib/gcc/x86_64-w64-mingw32/12.2.1/../../../../x86_64-w64-mingw32/bin/ld: /usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libreadline.a(shell.o):(.text+0x111): undefined reference to `__chk_fail' /usr/lib/gcc/x86_64-w64-mingw32/12.2.1/../../../../x86_64-w64-mingw32/bin/ld: /usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libmingwex.a(lib64_libmingwex_a-dirent.o):(.text+0x2bc): undefined reference to `__strcpy_chk' collect2: error: ld returned 1 exit status
解决方案
补充依赖库并调整编译命令:
readline依赖ncurses库,静态链接时必须显式链接对应的静态库。另外MinGW环境下,__chk_fail、__strcpy_chk这类安全函数需要依赖libmingwex.a和libmsvcrt.a。修改编译命令,按依赖顺序添加库,并使用-static参数强制静态链接:x86_64-w64-mingw32-gcc ./*.c -Wall -static -lreadline -lncurses -lmingwex -lmsvcrt <其他编译选项>注意库的顺序不能乱,被依赖的库要放在依赖它的库后面。
安装完整的MinGW静态库包:
确保Fedora上已经安装了readline和ncurses的MinGW静态库包,执行以下命令安装:sudo dnf install mingw64-readline-static mingw64-ncurses-static禁用GCC安全增强功能(可选):
如果仍出现安全函数相关的未定义引用错误,添加-D_FORTIFY_SOURCE=0编译参数,禁用GCC的安全检查功能,避免生成对__strcpy_chk这类函数的引用:x86_64-w64-mingw32-gcc ./*.c -Wall -static -D_FORTIFY_SOURCE=0 -lreadline -lncurses -lmingwex -lmsvcrt <其他编译选项>
内容的提问来源于stack exchange,提问作者td244
相关产品推荐
相关产品推荐

