llibcurl 編譯總結

2021-02-13 遊學四方

       這兩天在調試代碼的時候,出現一些錯誤,發現是同時調用了兩份libcurl靜態庫引起的。需要重新編譯一份libcurl的動態庫。Windows版本的libcurl編譯過程相對來說,是比較痛苦的。主要在於編譯環境的搭建,如果環境搭建好了,速度還是很快的。本文檔將會在CSDN中開放,同時也會保存在公司內部使用,不涉及到公司信息保密問題。

1.libcurl的作用libcurl主要功能就是用不同的協議連接和溝通不同的伺服器~也就是相當封裝了的sockPHP 支持libcurl(允許你用不同的協議連接和溝通不同的伺服器)。, libcurl當前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協議。libcurl同樣支持HTTPS證書授權,HTTP POST, HTTP PUT, FTP 上傳(當然你也可以使用PHP的ftp擴展), HTTP基本表單上傳,代理,cookies,和用戶認證。2.OpenSSLOpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。3.為什麼libcurl需要OpenSSL

libcurl為了實現HTTPS需要OpenSSL提供支持,在進行編譯libcurl之前,最好是編譯好OpenSSL。

4.環境搭建

(1)安裝Perl程序
openssl編譯 Configure的時候,使用到perl程序,在window 下比較流行當仁不讓就是 activeperl
 http://dl.softmgr.qq.com/original/Development/ActivePerl-5.16.3.1604-MSWin32-x64-298023.msi
安裝比較簡單,默認安裝就可以了,不要做其他操作。
(2)安裝NASM 彙編器
編譯可以使用vc++編譯器來編譯OpenSSL,使用彙編器編譯有更快的速度,本人使用彙編器是nasm。
http://www.nasm.us/pub/nasm/releasebuilds/2.11.05/win32/nasm-2.11.05-installer.exe

5.使用彙編器NASM編譯OpenSSL庫

本人安裝是VS2005開發環境, OpenSSL需要使用Visual Studio 命令行方式編譯。
1) 點擊 開始->所有程序->Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 命令提示(2005)
2)再打開編譯窗口,將上面安裝NASM的路徑添加到PATH環境變量裡 PATH=%PATH%;」c:\Program Files (x86)\nasm」
3)進入OpenSSL的工作目錄 D:\Code\sdkdev\LCLibcurl\Trunk\openssl-1.0.2h

4)執行命令 perl Configure VC-WIN32, 使用默認安裝路徑,靜態庫編譯方式,頭文件保存在inc32\openssl,庫保存在out32文件夾。動態庫編譯方式,頭文件保存在inc32\openssl,庫保存在out32dll文件夾中。
5)生存Makefile 文件 ms\do_nasm
如果不是使用nasm彙編器,這一步使用其他的命令代代替(如ms\do_ms)
輸出如下:

6.開始編譯如果要編譯成動態庫使用 nmake -f ms\ntdll.mak
如果要編譯成靜態庫使用 nmake -f ms\nt.mak
本次編譯成靜態連結庫,所以使用nmake -f ms\nt.mak
等待差不多五分鐘,只要不出現「stop」,安全地執行到結束,就算成功。
一旦中間出了差錯,最好是把文件夾也刪了,重新解壓、配置編譯,如果你留有編譯失敗的半成品,它可能會告訴你「無法解析XXX」。
將 D:\Code\sdkdev\LCLibcurl\Trunk\openssl-1.0.2h\inc32\openssl
所有的.h 和 D:\Code\sdkdev\LCLibcurl\Trunk\openssl-1.0.2h\out32的 libeay32.lib、libeay32.dll、ssleay32.lib、ssleay32.dll 一起複製到 D:\Code\sdkdev\LCLibcurl\Trunk\curl-7.37.0\curl-7.37.0\lib\openssl 中。

6.libcurl編譯:
ibcurl編譯:
debug版本:編譯靜態庫
編譯平臺選擇 DLL Debug - DLL OpenSSL
D:\Code\sdkdev\LCLibcurl\Trunk\curl-7.37.0\curl-7.37.0\projects\Windows\VC8
curl-7.37.0 ->projects -> Windows -> VC8 -> curl。sln,使用vs2005進行編譯。
將 libcurl 設為啟動項目,選擇 libcurl -> Resource Files -> libcurl.rc,右鍵「移出」,它記錄著版本信息,只會增大文件,可以移出掉。
選擇 屬性 -> C/C++ -> 預處理器 -> 預處理器定義,將」BUILDING_LIBCURL」改成」CURL_STATICLIB」。這樣那些接口函數就不會被聲明為導出函數了。
選擇 屬性 -> 連結器 -> 常規 -> 附加庫目錄 添加 ……..\lib\openssl,指向curl-7.37.0 -> lib -> openssl
選擇 屬性 -> 連結器 -> 輸入 -> 附加依賴項 添加 libeay32.lib;ssleay32.lib;ws2_32.lib;wldap32.lib; 前兩個是為了OpenSSL,後兩個是CURL必須依賴的。
在編譯成功後 curl-7.37.0 -> build -> Win32 -> VC8 -> DLL Debug - DLL OpenSSL 文件夾中會生成有 libcurld.dll 和 libcurld.lib(注意名字不是libcurl)。

release 版本編譯動態庫
編譯平臺選擇 DLL Debug - DLL OpenSSL
D:\Code\sdkdev\LCLibcurl\Trunk\curl-7.37.0\curl-7.37.0\projects\Windows\VC8
curl-7.37.0 ->projects -> Windows -> VC8 -> curl。sln,使用vs2005進行編譯。
將 libcurl 設為啟動項目,選擇 libcurl -> Resource Files -> libcurl.rc,右鍵「移出」,它記錄著版本信息,只會增大文件,可以移出掉。
選擇 屬性 -> C/C++ -> 預處理器 -> 預處理器定義,BUILDING_LIBCURL不需要更改。
選擇 屬性 -> 連結器 -> 常規 -> 附加庫目錄 添加 ……..\lib\openssl,指向curl-7.37.0 -> lib -> openssl
選擇 屬性 -> 連結器 -> 輸入 -> 附加依賴項 添加 libeay32.lib;ssleay32.lib;ws2_32.lib;wldap32.lib; 前兩個是為了OpenSSL,後兩個是CURL必須依賴的。
在編譯成功後 curl-7.37.0 -> build -> Win32 -> VC8 -> DLL Release- DLL OpenSSL 文件夾中會生成有 libcurl.dll 和 libcurl.lib。編譯成功之後,會保存在D:\Code\sdkdev\LCLibcurl\Trunk\curl-7.37.0\curl-7.37.0\build\Win32\VC8\DLL Release

相關焦點

  • MTK Android 編譯環境搭建總結
    apt-add-repository ppa:ubuntu-mate-dev/ppa sudo apt-add-repository ppa:ubuntu-mate-dev/trusty-mate sudo apt-get update sudo apt-get install ubuntu-mate-core ubuntu-mate-desktop5、開始編譯工作
  • openssl交叉編譯
    指定 openssl 配置文件的安裝目錄,如果不指定,默認安裝到 –prefix 指定目錄下的 ssl 目錄no- 不支持指定版本協商no- 不支持指定算法三、編譯安裝首先需要生成 Makefile 文件,可以通過 config 或者 Configure 腳本配置生成。
  • 不懼編譯error,編譯Tensorflow源碼
    筆者踩了不少坑後,總結出了一些解決方法形成此教程。1. 配置編譯環境1.1 選擇合適的編譯配置Tensorflow源碼編譯bug多一直被廣大用戶詬病,不同版本對應不同的編譯器,gpu版本還需要安裝對應的cuda和cudnn庫。
  • apk 下載 反編譯一氣呵成
    模仿別人的app,學習別人的開發經驗,將遇到的問題總結總結,以後再遇到問題,就不會卡住很久,畢竟問題總共就那麼多,遇到的越多,以後開發就回越流程。那麼如何模仿呢,我覺得需要以下這麼幾步。 1、下載apk文件。
  • APK反編譯步驟
    學習和開發Android應用有一段時間了,今天寫一篇博客總結一下Android的apk文件反編譯。
  • GCC編譯基礎
    一個完整的C++編譯過程(例如g++ a.cpp生成可執行文件),總共包含以下四個過程:編譯預處理,也稱預編譯,可以使用命令g++ -E執行連結,可以使用g++ xxx.o xxx.so xxx.a執行❝可以通過添加g++ --save-temps參數,保存編譯過程中生成的所有中間文件下面對這四個步驟進行逐一講解❞1、編譯預處理階段
  • Java代碼的編譯與反編譯
    一、什麼是編譯1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
  • 編譯系統入門篇-Android10.0編譯系統(一)
    Android系統的編譯歷程:2 編譯流程2.1 編譯構成  Android的編譯目錄在/build 中,看一下Android 10源碼中的build目錄,現在是這個樣子:  Android10.0上是通過soong執行編譯構建,這裡執行make命令時,main.mk文件把一些環境變量和目標都配置好後,會執行envsetup.sh中的make()進行編譯。  如果找到「build/soong/soong_ui.bash」,就使用soong_ui.bash 來進行編譯,否則使用原始的make命令進行編譯。
  • Python 中如何安全地進行編譯和反編譯?
    打包成的exe文件會不會輕而易舉地被反編譯?查閱了相關資料後發現,確實可能。二、pyinstaller 的反編譯過程1.反編譯pyc文件找到了pyc文件,下面自然就是對它進行解密了。pyc其實是python程序執行過程中產生的緩存文件,我們直接運行python代碼時也會看到。對於這種格式的反編譯是比較簡單的,網上有許多工具,甚至還有很多在線工具。這裡為了方便,我就採用了一款在線工具。
  • 編譯環境初始化-Android10.0編譯系統(二)
    《編譯系統系列》1 概述  上一節針對Android編譯系統做了一個籠統的說明,這一節針對編譯環境初始化做一下詳細的展示。m編譯整個源碼,可以不用切換到根目錄mm編譯當前目錄下的源碼,不包含他們的依賴模塊mmm編譯指定目錄下的所有模塊,不包含他們的依賴模塊   例如:mmm dir/:target1,target2.
  • 編譯筆記:LLVM & Rust 編譯過程
    編譯筆記:LLVM & Rust 編譯過程前置知識 編譯原理先回顧一下編譯原理的概念以及編譯流程
  • MAC下編譯libwebp庫
    最近由於項目需要,需要使用libwebp庫,解碼webp格式的動圖和靜態圖片,故將編譯庫的過程整理總結,以做記錄。
  • 【C語言系列】C語言編譯流程分析
    前幾天看了《程式設計師的自我修養——連結、裝載與庫》中的第二章「編譯和連結」,主要根據其中的內容簡單總結一下C程序編譯的過程吧。
  • Mac下編譯FFmpeg(iOS平臺)
    此文件主要目的是用FFmpeg編譯iOS平臺的靜態庫,網上此類文章較多,我就不在此過多陳述,以下腳本均由本人測試及正常使用過後總結。
  • 聊一聊 JIT 即時編譯
    Java 語言有一個重要的特性,「一次編譯,到處運行」。該特性是依賴於「字節碼」這樣一種中間形式來實現的。具體來說,要想運行一段 Java 程序,首先需要利用 javac 將程序編譯成字節碼,但由於計算機並不認識字節碼,只認識機器碼,因此,還需要一個被稱為「解釋器」的翻譯官,將字節碼逐條解釋為機器碼,從而使代碼最終得以執行。
  • 使用源碼編譯安裝MySQL
    服務登錄MySQL資料庫總結前言前面的文章中,我們介紹了MySQL使用二進位文件安裝的大致過程。也可以把這個boost文件目錄放到其他的位置,但是在執行編譯的時候需要使用參數聲明boost文件夾目錄。放在/usr/local下面,是MySQL編譯的時候使用的默認的位置。開始編譯操作下面我們開始編譯源碼的步驟,這個步驟中會遇到各種錯誤。我們遇到每一個錯誤都挨個排查,一個個解決。
  • 常用java反編譯工具匯總
    以下是個人常用的幾種java反編譯工具,個人比較推薦使用IDEA自帶的反編譯組件,直接調用IDEA的java-decompiler組件進行反編譯,也方便進行調試分析。部分工具不僅限於反編譯,其他功能請自行摸索。蘿蔔青菜,各有所愛,各位依據自身情況選擇工具。
  • Android 編譯過程 - Android10.0編譯系統(三)
    Android系統的編譯歷程:3 Soong編譯系統家族成員從下圖可知,mk文件被編譯成了 out/build-aosp_arm.ninja和out/build-aosp_arm-package.ninja,bp文件被編譯成了out/soong/build.ninja,這三個ninja文件又被合併成out/combined-aosp_arm.ninja
  • 折騰~嘗試源碼編譯mariadb
    下圖可以看到沒有configure,那麼我們就無法使用其為我們生成Makefile文件進行編譯了。    開始編譯,過程比較慢,卡在了91%十幾分鐘。。。    使用configure編譯,報錯Cannot find appropriate C compiler on this system,說明沒有裝合適的C編譯器
  • 譯文 | Angular中的AoT編譯
    我們從下面這些話題開始來回答這些問題:為什麼Angular需要編譯?什麼東西會被編譯?他們是如何被編譯的?編譯發生在什麼時候?JiT vs AoT我們從AoT中獲得了什麼?AoT編譯是如何工作的?我們使用AoT和JiT的代價是什麼?為什麼Angular需要編譯?