深入淺出cmake

前言

最近在研究libcurl庫,毫無疑問提供了cmake的編譯工程。針對幾個關係利害點說明。衆所周知,cmake 是一個跨平臺的編譯功臣構建工具。其中不免對gcc或者g++的編譯器進行各種配置。而本身cmake的語法就類似python等過程式的語言。cmake爲什麼會跨平臺?首先你得對跨平臺有所瞭解,不同平臺的編譯器的使用規則不同,通常無非是兼容windows和linux,而unix和linux類似。

編譯器在cmake中的權重

首先跨平臺代碼有決定性的關係,不同的system中提供給的api不一樣,我在windos中的代碼想要跨平臺到linux,那麼肯定是不能出現#include <windos.h>這種玩意。如果出現這種東西需要根據編譯器平臺進行代碼控制如下:

#ifdef _WIN32||_WIN64
#include <windows.h>
#else Linux
#endif
  • windows下mingw體系,基本上linux的庫都有所兼容(排除chrome內核和Kvm不)
  • windows下MSVC體系,只要提供源碼,就能夠編譯過(排除非linux標準的庫,sys/*.h 這種在windows下是不能夠使用的,還有socket庫)
  • linux下linux-compile-toolchains。gcc和g++
  • 其他適配平臺編譯器llvm-clang(源碼構造兼容win,linux ,mac)可定製開發編譯器(包括clang的提示語法),首先你得根據現有編譯器進行源碼編譯

cmake實現的功能,舉個例子(linux-compile-toolchains):
g++ myexe -o test.cpp main.cpp -I/usr/include/xxxxdir -L/usr/lib/xxxx -lz
這是一條g++編譯語句的實現

  • 其中 -o 表示 -target-output 意味輸出目標,-I表示-include_directors 意味着頭文件檢索目錄。
  • -L表示 -libraries-director意味鏈接庫目錄編譯時導入的lib庫目錄
  • -l表示link-libraries 意味着對庫進行鏈接
    爲什麼要提及compile-toolchains的編譯語句?因爲cmake就是針對這個進行封裝的上層編譯框架CMAKE_CXX_COMPILE 對應着平臺編譯器的執行程序,這裏不深究爲什麼windows 執行和linux執行方式不一致導致的兼容的問題,判斷平臺不簡單嗎通過命令行的參數調用 (CMAKE_CXX_COMPILE -version 輕鬆跨平臺判斷)

爲何有些CMAKE_CXX_COMPILE not found 這種低級錯誤都有人解決不了。因爲爲你對toolchains都不瞭解談何解決問題?不說百分之百的瞭解編譯器的參數,但是你得有個印象和知道參數是幹嘛的對吧。

發佈包和linux文件樹

在這裏插入圖片描述
開發者的關注點應該圖上紅色部分。涉及編譯器自動找庫的問題,如果出現undefined xxx,一般就是庫沒有找到,你得挨個查看這些文件夾下是否存在庫文件,如果存在庫文件提示找不到,需要查看當前系統的環境變量是否存在默認引用目錄。什麼是發佈包?ubuntu中 apt-get install package 這個package就是發佈包,cmake的發佈包來自cmakelists.txt 其中cmake 指明瞭install()語句。我們把整個工程叫做源碼發佈包而無論是dpkg 還是config-pkg 中的 package 都是適應工具進行安裝包管理。

cmake 源碼工程習慣

  • cmake結構樹 每一個模塊都應該存在cmakelists.txt。
    這是因爲模塊開發的思維,毫無疑問,沒有軟件工程規劃的項目都是垃圾。
    在這裏插入圖片描述
  • cmake自動化測試腳本 通過cmake生成exe調用命令行進行參數測試
    測試lib需要在此之前寫mian的入口函數文件。
    在這裏插入圖片描述
  • cmake Findxxxx.cmake
    這個文件就是一個cmake語句的文件,單獨分離作爲依賴庫包的查找選項,通過include(Findxxxx.cmake)調用
    在這裏插入圖片描述
  • cmake 函數定義與使用
    在這裏插入圖片描述
    如果當前函數未找到函數定義那麼 就應該搜索cmake官方文檔查找相關定義。

掌握基本的cmake習慣,照着葫蘆畫瓢你還不知道怎麼寫嗎。

發佈了44 篇原創文章 · 獲贊 24 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章