mingw 环境编译 liburl故障一例
环境是 windows 10,已经安装 mingw,并设置好mingw 和 msys的环境变量
C:\Users\cracker>set |grep MinGW Path=C:\Program Files (x86)\Windows Resource Kits\Tools\;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\MinGW\bin;C:\MinGW\msys\1.0\bin C:\Users\cracker>systeminfo | grep OS OS 名称: Microsoft Windows 10 专业版 OS 版本: 10.0.14393 暂缺 Build 14393 OS 制造商: Microsoft Corporation OS 配置: 独立工作站 OS 构件类型: Multiprocessor Free BIOS 版本: LENOVO H2ET68WW(1.68), 2013/5/17 C:\Users\cracker>
下载curl源代码,执行configure
C:\Users\crackme\Downloads\curl-7.50.3\curl-7.50.3>perl configure
一会儿之后出错了
checking whether time.h and sys/time.h may both be included... (cached) yes
checking for sys/types.h... (cached) yes
checking for sys/time.h... (cached) yes
checking for time.h... (cached) yes
checking for sys/socket.h... (cached) no
checking for struct timeval... yes
checking run-time libs availability... failed
configure: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lwldap32 -lws2_32
C:\Users\crackme\Downloads\curl-7.50.3\curl-7.50.3>
无数次的 google 和 baidu 都找不出原因。看日志:
configure:27930: checking run-time libs availability configure:27947: gcc -o conftest.exe -O2 -Wno-system-headers conftest.c -lwldap32 -lws2_32 >&5 conftest.c:92:1: warning: return type defaults to 'int' [-Wimplicit-int] main() ^ configure:27947: $? = 0 configure:27947: ./conftest.exe - Cannot openconfigure:27947: $? = 1 configure: program exited with status 1 configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "curl" ...... | #define HAVE_STRUCT_TIMEVAL 1 | /* end confdefs.h. */ | | main() | { | return 0; | } | configure:27951: result: failed configure:27953: error: one or more libs available at link-time are not available run-time. Libs used at link-time: -lwldap32 -lws2_32
可以看出,这些日志的大致意思是:编译了一个 conftest.exe。但执行失败了。所以得出结论"one or more libs available at link-time are not available run-time"。
conftest.exe 的源代码很简单
| main() | { | return 0; | } |
为什么会执行失败呢?上测试代码。
C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>echo main(){ return 0; } >conftest.c C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>gcc -o conftest.exe conftest.c conftest.c:1:1: warning: return type defaults to 'int' [-Wimplicit-int] main(){ return 0; } ^ C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>conftest.exe 系统无法执行指定的程序。 C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>g++ -o conftest_gpp.exe conftest.c C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>conftest_gpp.exe C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>
同样的代码,分别用gcc和 g++编译,都编译成功,但gcc编译的 conftest.exe不能执行,而g++编译的conftest_gpp.exe 没有报错。检查了 gcc的版本什么的都没有问题。后来gcc执行编译时,电脑右下角总会弹出个提示:
想到可能是 windows defender在作怪。测试一下:
C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>copy conftest.exe temp.exe 无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。 已复制 0 个文件。 C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>
确认了猜测。关闭 windows defender ,编译成功。
windows defender 这杀毒水平,我也是醉了。
C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>set OPENSSL_PATH=C:\MinGW\msys\1.0\local\ssl C:\Users\cracker\Downloads\curl-7.50.3\curl-7.50.3>mingw32-make mingw32-ssl
C:\MinGW\msys\1.0\local\ssl 是 openssl的安装目录。openssl的安装编译比较简单:
下载 openssl并编译
C:\Users\cracker\Downloads\openssl-1.0.2j\openssl-1.0.2j>perl Configure enable-shared mingw
C:\Users\cracker\Downloads\openssl-1.0.2j\openssl-1.0.2j>make
C:\Users\crackme\Downloads\openssl-1.0.2j\openssl-1.0.2j>make install
perl 是 msys自带的。如果 perl命令失败,则是上一步没设置好 环境变量。
enable-shared 是指示 openssl生成动态连接库 dll。这个参数不是必须的。没有该参数则只会生成静态连接库 .a
mingw指示设置编译环境为 mingw。
范晨鹏
------------------
软件是一种态度
成功是一种习惯