curl+openssl,編譯win32 兼容xp系統的靜態庫

版本:openssl-1.0.2n

版本:curl-7.46.0

說明:請通過curl官網獲取curl所支持的openssl版本(https://curl.haxx.se/

1、編譯openssl靜態庫

1.1、參考官方的編譯說明

- If you don't want to use the assembly language files at all then run:

   > perl Configure VC-WIN32 no-asm --prefix=c:/some/openssl/dir
   > ms\do_ms

 

1.2 、生成所需的makefile文件

:: bat 腳本
perl Configure VC-WIN32  no-asm ^
     --prefix=.\\OpenSSL-Win32_MSVC141_xp ^
     -D_WIN32_WINNT=0x0501 ^
     -D_USING_V110_SDK71_ 

ms\do_ms

 其中:-D_WIN32_WINNT=0x0501 是爲了兼容xp系統所選的宏
            -D_USING_V110_SDK71_ 我用的vs2017

修改 ms\nt.mak 使得編譯出來的庫兼容xp系統

1.3、編譯生成庫

:: bat 腳本

:: 編譯
nmake -f ms\nt.mak

:: 測試
nmake -f ms\nt.mak test

:: 安裝
nmake -f ms\ntdll.mak install

2、編譯curl靜態庫

2.1、參考官方的編譯說明

2.2、根據編譯說明編寫編譯bat腳本

goto begin_bat
  mode=static             目標文件爲靜態庫
  VC=6                    VC的版本
  RTLIBCFG=static         /MT
  DEBUG=no                release版本
  MACHINE=x86             目標文件x86,win32
  ENABLE_WINSSL=yes       curl庫連接ssl庫,支持https
  WITH_SSL=static         連接ssl時使用靜態庫
  WITH_DEVEL=../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp 
                          ssl的安裝包目錄,切記路徑後面無'/' 因爲makefile文件中已補齊了'/'
:begin_bat


nmake /f Makefile.vc mode=static ^
           VC=6 ^
           RTLIBCFG=static ^
           DEBUG=no ^
           MACHINE=x86 ^
           ENABLE_WINSSL=yes ^
           WITH_SSL=static ^
           WITH_DEVEL=../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp

Instructions 

  1. Download and extract the CUrl source code to a temp directory. http://curl.haxx.se/download.html, in this tutorial we will be using curl-7.37.0
  2. Open the “Visual Studio Command Prompt (2010)”
  3. Browse to the Winbuilds folder. \curl-7.37.0\winbuild.
  4. Type “Set RTLIBCFG=static ” in to the command prompt and hit enter. This will set up the compiler to build for  /MT and /MTd.
  5. Type “nmake /f MakeFile.vc mode=static DEBUG=yes” to build the debug version or
    Type “nmake /f MakeFile.vc mode=static DEBUG=no” to build the release versions.

 2.3、修改編譯時調用的MakefileBuild.vc文件

增加xp系統的兼容,由以下代碼

CURL_LFLAGS   = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)

 改爲

CURL_LFLAGS   = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console,"5.01" /machine:$(MACHINE)

2.4、執行bat腳本編譯時,莫名其妙出現錯誤提示

../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(154): error C2059: 語法錯誤:“<parameter-list>”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(397): error C2059: 語法錯誤:“<parameter-list>”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2059: 語法錯誤:“(”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(398): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(399): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(401): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2059: 語法錯誤:“(”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(413): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(424): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(426): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(428): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2059: 語法錯誤:“(”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(429): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(431): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(432): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(434): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(438): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(440): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(441): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(458): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(459): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(467): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2143: 語法錯誤: 缺少“)”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2143: 語法錯誤: 缺少“{”(在“常數”的前面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(468): error C2059: 語法錯誤:“常數”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(473): error C2143: 語法錯誤: 缺少“)”(在“(”的前 面)
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(473): error C2091: 函數返回函數
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(473): error C2059: 語法錯誤:“)”
../../openssl-1.0.2n/OpenSSL-Win32_MSVC141_xp/include\openssl/ocsp.h(473): fatal error C1003: 錯誤計數超過 100;正在停止編譯
NMAKE : fatal error U1077: “"D:\Program Files (x86)\vs2017\VC\Tools\MSVC\14.13.26128\bin\HostX86\x86\cl.exe"”: 返回代 碼“0x2”
Stop.
NMAKE : fatal error U1077: “"D:\Program Files (x86)\vs2017\VC\Tools\MSVC\14.13.26128\bin\HostX86\x86\nmake.exe"”: 返回代碼“0x2”
Stop.

碰壁1:  

分析頭文件和源碼沒什麼毛病啊(windows的編譯器提示錯誤就是個神經病,有時候整的你都不知道自己錯在哪了,懷疑人生了,屌絲如何逆襲)。經過查看官網對 error C2059: 的解釋,可知查看指向的位置所處的變量類型(尤其是typdef自定義的類型)有可能有問題,全局搜索如下:

發現其他頭文件中有對此類型 #undef 的操作,因此在當前頭文件中也增加了此釋放自定義的語句 "#undef OCSP_REQUEST"

再次編譯之後,對應指向的錯誤消失了,真是跟打仗一樣,沒吃沒喝乾,沒日沒夜的弄,其他錯誤依法炮製即可消滅錯誤,完成最終勝利,如下是libcurl的靜態庫安裝包

備註:消除錯誤建議從上至下,因爲最下面的錯誤有可能就是最上面的錯誤引起的。你懂的!

 碰壁2:

 奶奶的,好不容易搞定了 libcurl_a.lib (生成了靜態庫),但是應用在項目中時提示如下錯誤:(不搞瘋俺,心有不甘吶)

libcurl_a.lib(easy.obj) : error LNK2001: 無法解析的外部符號 _strdup
libcurl_a.lib(easy.obj) : error LNK2019: 無法解析的外部符號 __imp__strdup,該符號在函數 _curl_easy_init 中被引用
libcurl_a.lib(strequal.obj) : error LNK2019: 無法解析的外部符號 __imp__stricmp,該符號在函數 _curl_strequal 中被引用
libcurl_a.lib(strequal.obj) : error LNK2019: 無法解析的外部符號 __imp__strnicmp,該符號在函數 _curl_strnequal 中被引用
libcurl_a.lib(warnless.obj) : error LNK2019: 無法解析的外部符號 __imp__read,該符號在函數 _curlx_read 中被引用
libcurl_a.lib(warnless.obj) : error LNK2019: 無法解析的外部符號 __imp__write,該符號在函數 _curlx_write 中被引用
libcurl_a.lib(curl_threads.obj) : error LNK2019: 無法解析的外部符號 __imp___beginthreadex,該符號在函數 _Curl_thread_create 中被引用
libcurl_a.lib(file.obj) : error LNK2019: 無法解析的外部符號 __imp__close,該符號在函數 _file_done 中被引用
libcurl_a.lib(file.obj) : error LNK2019: 無法解析的外部符號 __imp__open,該符號在函數 _file_connect 中被引用
lib_windows\common2.dll : fatal error LNK1120: 9 個無法解析的外部命令

不清楚基於什麼原因當前連接庫沒有read,write,open,close的接口,查資料,問度娘,都沒找到方法,最笨的一個方法修改curl源碼中對應接口,替換成fopen,fclose,fread,fwrite,還有自己實現了 strdup,stricmp,strnicmp 的接口 ,最終終於搞定:

親測:在xp上此方案運行正常

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章