make和cmake構建工具,linux環境源碼編譯


  在linux環境下編程,標配的編譯器是gcc,g++,以及構建工具make,cmake。linux中和開發環境密切相關的有/usr/bin(命令程序), /usr/include(源碼),/usr/lib(編譯的庫),這些其實和c/c++的編程很密切。

gcc -o NameMain name.c main.c // 典型的gcc使用方法

  我們嘗試使用在linux環境,使用make工具編譯git源碼。編譯過程中提示找不到curl.h/curl.c文件,這個就是說該目錄下沒有,/usr/include目錄也沒有,那么就需要手動去下載。解決了這個依賴,還有其他依賴,手動安裝git確實很麻煩,應為還要安裝很多的依賴庫,所以最好還是使用二進制安裝包,比如mysql。

  回顧我們開發c/c++程序的過程,一般從源碼.cpp到可執行的機器碼,需要源碼文件,一般也會引用別人的庫文件,make就是處理文件間的依賴關系的shell命令,其依賴和構建規則使用Makefile說明,這里推薦阮一峰老師的make教程。下面老說說makefile文件的編寫:

<target> : <prerequisites> 
[tab]  <commands>

   這就是makefile的構成單元,非常簡單明了,其中,commands就可以使用g++命令了。這樣我們可以直接執行makefile文件,而不是逐個編譯,鏈接,大大提高了工作效率。make install其實是一個約定的target,用於向計算機中寫入庫文件。make -D CMAKE_INSTALL_PREFIX=/usr/local,用於指定安裝路徑,cmake默認會安裝在,usr/local中。

  可以看到,如果程序規模很大,編寫Makefile也工作量也會很大,並且其修改也會很麻煩,於是cmake工具來啦,簡單一句話就是生成Makefile的工具,其核心是CMakeLists.txt,這是一個典型的CMakeLists.txt的寫法,它其中體現了很多特殊的命令,比如cmake_minimum_required要求對於cmake版本的支持,project命令說明了其工程的名字。if,else,set等命令的支持等。

#一般都以這一行開始
cmake_minimum_required (VERSION 2.6)
 
#項目名
project (TEST)
 
#選擇編譯器,LINUX上選擇g++,MAC OS上選擇clang++
if (APPLE)
	set (CMAKE_CXX_COMPILER clang++)
elseif (UNIX)
	set (CMAKE_CXX_COMPILER g++)
endif()

#設置編譯器選項支持c++11
set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++11)
 
#查找boost庫
find_library (BOOST_SYSTEM
	NAMES boost_system
	PATHS /usr/lib /usr/local/lib
	)
 
find_library (BOOST_THREAD
	NAMES boost_thread
	PATHS /usr/lib /usr/local/lib
	)
 
 
#設置數學庫的目標名,該變量在子目錄也是可見的
set (MATH_LIB "my_math")
 
#添加頭文件搜索路徑
include_directories (./math)
 
#添加子目錄,這樣math目錄才會被編譯
add_subdirectory (math)
 
#添加可執行目標文件Test
add_executable (Test main.cpp)
 
#LIBS變量存儲所有需要鏈接的庫
set (LIBS ${MATH_LIB})
 
if (BOOST_SYSTEM) 
	set (LIBS ${LIBS} ${BOOST_SYSTEM})
endif()
 
if (BOOST_THREAD)
	set (LIBS ${LIBS} ${BOOST_THREAD})
endif()
 
#為可執行文件鏈接數學庫

————————————————
版權聲明:本文為CSDN博主「jupiterwangq」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ztemt_sw2/article/details/81355096

參考資料:

阮一峰make教程

cmake官方說明文檔

configure和make的原理和使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM