版本: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
- 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
- Open the “Visual Studio Command Prompt (2010)”
- Browse to the Winbuilds folder. \curl-7.37.0\winbuild.
- Type “Set RTLIBCFG=static ” in to the command prompt and hit enter. This will set up the compiler to build for /MT and /MTd.
- 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上此方案運行正常