Cmake使用教學及介紹_打包C++_Library_如何使用CMake和Visual Studio 去建置一個 open source project_ShareLibrary和StaticLibrary差異




Cmake 主要是常用的跨平台編譯器

以下我們就用CodeBlock寫一支簡單HelloWorld輸出的小程式
再次溫故悉知一次寫好的程式碼到封裝至運行的整體流程喔!!!!

File --> New Project
 選擇 Console Application
 在此選擇C++
 將專案命名好


這裡的 GNU GCC Compiler
指的就是一種編譯器(講白話一些就是翻譯官  翻譯人員)
GCC主要全稱就是  GNU Compiler Collection
GNU編譯器套裝
是以GPL及LGPL授權條款所發行的自由軟體
GCC (以C語言編譯器為主要發展特色/1985年由理察·馬修·斯托曼開始發展)
也常被認為是跨平台編譯器的一種標準



GNU(商標主要是一隻牛羚)  ---> 主要是一種自由作業系統,其內容軟體
完全以GPL(General Public License)方式釋出
也就是所謂的  「通用授權條款」
GPL授予程式接受人以下自由權利:
  * 以任何目的運行此程式的自由;
  * 再複製的自由;
  * 改進此程式,並公開發布改進的自由(前提是能得到源代碼)。
==>尋求確保上述自由能在複製軟體衍生作品中得到保障
也是一般廣泛大眾使用的很常聽到的免費軟體授權條款






就多出了  bin 及 obj目錄



bin目錄主要放置 經過Compiler翻譯成電腦看的懂的機器碼(執行檔  .exe)
也就是二進制binrary的英文縮寫,主要用來存放編譯的結果
最初C編譯的程序文件都是二進制的File


若你使用visual studio編譯則會分成有Debug(測試區)和Release(正是區)兩個版本
分別對應的文件夾爲bin/Debug和bin/Release



obj目錄則是放了   .o檔案

那基本上你可能會好奇這兩個目錄的差異
還有打開基本上都是像加密過的亂碼一樣看不太懂


以下在來看一個  Visual Studio 在編譯時過程


預設建置好一個新的C++ Win32 Console方案中底下的專案時
只會有

一個ConsoleApplication方案 的Folder
底下分
三個檔
ConsoleApplication專案名稱.opensdf
ConsoleApplication專案名稱.sln
ConsoleApplication專案名稱.v11.suo   ---->因為是使用vs2012 所以對應的是v11喔!!!!
一個目錄
ConsoleApplication專案名稱的Folder
(和專案同名的子目錄)




 用DebugMode建置後
就在此層多出Debug字眼目錄




====================================================================
如下展示如何搭配  git  , Cmake
去做開放庫gFlag的建置(Build)

工具列表
1.Cmake
https://cmake.org/download/
2.git
https://git-scm.com
或  小烏龜
https://tortoisegit.org
3.gFlags Library
The gflags package contains a C++ library that implements commandline flags processing.
https://github.com/gflags/gflags

4.visual studio (當前示範使用2012)




====================================================================
gFlags Library

Step1.

Step2.開啟  git bash window
指令:  git clone 剛剛複製的URL

或用  小烏龜  也可以





Cmake下載及安裝流程
Step1.進官網連結下載
Cmake
https://cmake.org/download/



Step2.使用Cmake編譯一支程式
開啟 Cmake Gui

琣配置選好的來源及存放目的目錄路徑後
按下  Configure



當你按完  Configure之後
會生成紅色背景一系列的選項
BUILD_SHARED_LIBS     
------> 這裡打勾是for 動態連結庫(DLL)
若沒有要特別生成出動態  -----> 照預設選項勾選擇是 FOR 靜態的(.LIB)


選擇 .dll
可達到  Smaller Executable 的特性
當選完按下 Generate之後
就會生出一堆 vcxproj的相關檔案


這裡我們要打開  sln檔案
由於我剛才選的是用vs2012去配置
所以若你使用  vs2013 ,2015去開
就會告知你要不要升級的訊息喔!!!!!這點切記!!!!!
要使用對應版去開或是Update它


這裡在 Build好之後你會看到
多出來的  Release目錄 及 Win32目錄字眼 跟其他目錄
就是因為我們剛才在vs2012選擇 用 正式區(Release) 及 Win32 Mode去編譯關係


那基本上 Win32那裏都是生成 Log的編譯歷程紀錄
我們到   ..\gflags\BUILD_\bin\Release
底下就能看到剛才我們所編譯生成的dll了優~~~

=============================================================
在看下去之前可以先參考之前寫的兩篇文章會更加有概念
C#自建類庫項目DLL_做一個自己的dll
http://coolmandiary.blogspot.tw/2016/12/cdlldll.html

C#_DLL反編譯功能_EXE(Application)和DLL(Application Extension)的差別在哪???
_DLL的意義_反編譯目的
http://coolmandiary.blogspot.tw/2017/04/cdllexeapplicationdllapplication.html
=============================================================
介紹到這你可能會有個疑問到底

捨麼是 Shared Library? (就是指 DLL)
捨麼是 Linking?
捨麼是 Static Library?
Shared LibraryStatic Library差異
從外觀特徵(副檔名)講起

Static Library
By Windows 平台 : .lib (Library)
By Linux : .a   (Archive)

Shared(Dynamic) Library
By Windows 平台 : .dll (Dynamic Link Library)
By Linux : .so (Shared Object)


從運行上來比較
最早也是最常見到的 DLL
主要是包在於 WIndows API中的
(1)Kernel32.dll
當中又包含了
管理內存、Process跟Thread等等各個函數
(2)User32.dll
包含用來執行用戶介面任務
(3)GDI32.dll
畫圖、文字文本顯示用途


用動態連結庫(DLL)好處
就是它是參照該程式庫的 Address(記憶體中某一塊位址)
所以只要Compile一次就可以也不花時間在每次都要重新建置
1.可用多種程式語言做開發撰寫(Ex:用VB寫介面 ,調用其他語言完成業務邏輯的DLL )
2.提供二次開發衍生功能
3.可節省磁碟空間
4.助於資源共享(Shared)
5.助於實踐應用程式Local化
6.簡化專案控制管理

相反的

靜態連結庫
假如你寫一個程式當中有一個function
然後你想要將其功能服務連結至其他檔案的時候就會有檔案大小超載變過大的問題

同樣的功能程式
在檔案1 調用了 200次
在檔案2 調用了 100次
當彼此共同用Linker去包裝過後就會產生較大的執行程式檔案



特徵就是程式碼比較大一包而且是整串Code
直接Call (Copy過去才能使用)
而且配置上可能還會遇到版本問題或是水土不服
比較缺乏共享性質
且十分佔據資源空間










留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients