理論上說,任意一個C++程序均可以用g++來編譯。linux
你們都知道,寫程序大致步驟以下:c++
一、用編輯器編寫源代碼,如.c文件。程序員
二、用編譯器編譯代碼生成目標文件,如.o。編程
三、用連接器鏈接目標代碼生成可執行文件,如.exe。編輯器
makefile函數
但若是源文件太多,一個一個編譯時就會特別麻煩,因而人們想到,爲何不設計一種相似批處理的程序,來批處理編譯源文件呢?工具
因而就有了make工具,它是一個自動化編譯工具,你可使用一條命令實現徹底編譯。post
可是你須要編寫一個規則文件,make依據它來批處理編譯,這個文件就是makefile,因此編寫makefile文件也是一個程序員所必備的技能。ui
Unix中Make三連spa
Unix 開發過程當中,常常性的操做是從源碼編譯安裝相應庫文件,因此下面三個命令即是屢見不鮮,俗稱三連:
./configure
make
make install
下面來看看這三步分別作了什麼。
configure
執行 ./configure 文件通常是進行正式編譯前的一些環境準備,準備編譯須要的依賴項等。好比檢測當前的系統平臺,檢測須要的編譯器是否存在如何調用,配置和生成相應編譯所需文件。
make
前期準備工做完成無誤後,就可能調用 make 來執行編譯了。實際執行的是 Makefile 文件中定義的任務來從源碼進行項目的編譯。
一般狀況下下載下來的 tar 包中可能沒有包含正式的 Makefile 文件,而是另外形式呈現的臨時文件,好比 Makefile.in,Makefile.am,Makefile.MSVC 等,而後在執行 ./configure 的時候根據相應環境來生成最終須要的 Makefile 文件。
make install
項目編譯正常後,會生成相應的產出,可執行文件,so 或 o 文件或 DLL 動態連接文件等。最後一步就是將生成的文件複製到相應的系統目錄,這個過程即是安裝。
好比將可執行文件複製到系統 PATH 能取到的地方,幫助文檔複製到 MANPATH,其餘文件複製到對應目錄下。
CMakelists.txt
對於一個大工程,編寫makefile實在是件複雜的事,因而人們又想,爲何不設計一個工具,讀入全部源文件以後,自動生成makefile呢?
因而就出現了cmake工具,它可以輸出各類各樣的makefile或者project文件,從而幫助程序員減輕負擔。
可是隨之而來也就是編寫cmakelist文件,它是cmake所依據的規則。因此在編程的世界裏沒有捷徑可走,仍是要腳踏實地的。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#聲明要求的cmake最低版本 cmake_minimun_required(VERSION 2.8) #聲明一個cmake工程,工程名爲post_fusion project(post_fusion) # 添加c++ 11標準支持 set( CMAKE_CXX_FLAGS "-std=c++11" ) 若是程序中使用了C++11標準,則須要設置告訴編譯器,沒有能夠不用寫。 #設置編譯器編譯模式: set( CMAKE_BUILD_TYPE "Debug" ) 對於編譯用的Debug模式和調試用的Release模式,在Debug模式中,程序運行較慢,當能夠在IDE中進行斷點調試,而Release模式則速度較快,但沒有調試信息。不設置默認是Debug模式。 # 添加引用的第三方頭文件,例如添加Eigen頭文件 include_directories( "/usr/include/eigen3" ) #編譯生成庫文件 add_library(irfusion comfunc.c post_sins_gnss.cpp) #這條命令告訴cmake,咱們想把這些源文件編譯成一個叫做「irfusion」的庫。在linux中,庫文件分爲靜態庫和動態庫兩種,靜態庫以.a做爲後綴名,共享庫以.so結尾。 #全部庫都是一些函數打包後的集合,差異在於靜態庫每次被調用都會生成一個副本,而共享庫則只有一個副本,更省空間。若是想生成共享庫而不是靜態庫,只須要使用如下語句便可 add_library(irfusion_shared SHARED comfunc.c post_sins_gnss.cpp)此時獲得的文件就是irfusion_shared.so了。 #而後,在CMakeList.txt中添加一個可執行程序的生成命令,連接到剛纔使用的庫上: add_executable(irfusion main.cpp) target_link_libraries(irfusion irfusion_shared)
|