• mingw 环境编译 liburl故障一例


    环境是 windows 10,已经安装 mingw,并设置好mingw 和 msys的环境变量

    C:Userscracker>set |grep MinGW
    Path=C:Program Files (x86)Windows Resource KitsTools;C:ProgramDataOracleJavajavapath;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:MinGWin;C:MinGWmsys1.0in
    
    C:Userscracker>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:Userscracker>
    

     下载curl源代码,执行configure

    C:UserscrackmeDownloadscurl-7.50.3curl-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:UserscrackmeDownloadscurl-7.50.3curl-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:UserscrackerDownloadscurl-7.50.3curl-7.50.3>echo main(){ return 0; } >conftest.c
    C:UserscrackerDownloadscurl-7.50.3curl-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:UserscrackerDownloadscurl-7.50.3curl-7.50.3>conftest.exe
    系统无法执行指定的程序。
    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>g++ -o conftest_gpp.exe conftest.c
    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>conftest_gpp.exe
    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>
    

     同样的代码,分别用gcc和 g++编译,都编译成功,但gcc编译的 conftest.exe不能执行,而g++编译的conftest_gpp.exe 没有报错。检查了 gcc的版本什么的都没有问题。后来gcc执行编译时,电脑右下角总会弹出个提示:

    想到可能是 windows defender在作怪。测试一下:

    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>copy conftest.exe temp.exe
    无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。
    已复制         0 个文件。
    
    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>
    

    确认了猜测。关闭 windows defender ,编译成功。

     windows defender 这杀毒水平,我也是醉了。

     官方教程

    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>set OPENSSL_PATH=C:MinGWmsys1.0localssl
    C:UserscrackerDownloadscurl-7.50.3curl-7.50.3>mingw32-make mingw32-ssl
    

      

    C:MinGWmsys1.0localssl 是 openssl的安装目录。openssl的安装编译比较简单:

    下载 openssl并编译

    C:UserscrackerDownloadsopenssl-1.0.2jopenssl-1.0.2j>perl Configure enable-shared mingw
    C:UserscrackerDownloadsopenssl-1.0.2jopenssl-1.0.2j>make
    C:UserscrackmeDownloadsopenssl-1.0.2jopenssl-1.0.2j>make install

    perl 是 msys自带的。如果 perl命令失败,则是上一步没设置好 环境变量。

    enable-shared 是指示 openssl生成动态连接库 dll。这个参数不是必须的。没有该参数则只会生成静态连接库 .a

    mingw指示设置编译环境为 mingw。

  • 相关阅读:
    【扫盲】i++和++i的区别
    java 字符串String.intern()方法学习
    随机访问和快速访问
    Semaphore信号量深度解析
    CyclicBarrier回环屏障深度解析
    CountDownLatch深度剖析
    静态代理和装饰者模式的区别
    AspectJ之@DeclareParents注解为对象添加新方法
    C#开发上位机常用
    使用Charles进行抓包、篡改请求、设置代理
  • 原文地址:https://www.cnblogs.com/diylab/p/5930458.html
Copyright © 2020-2023  润新知