近來進行g2o優化庫的學習,第乙個demo程式就被cmake坑的很慘,之前對於cmake總感覺就是用著學著,但是這次踩坑之後發現這樣的方式確實會浪費一些時間,特別是沒有人帶的情況下,但是現階段自己也沒能拿出大塊的時間去學習cmake,所以特別的寫這個部落格,希望在以後的時間裡能對cmake的知識進行進一步的完整,相信慢慢的積累總能達到一些效果。
這個命令是cmake裡面應該算是最熟悉的命令了,最開始寫opencv程式的時候就會照著別人的cmakelists寫find_package(opencv required),當時也試過,寫成opencv或者opencv都會出問題,但是也沒有深究,現在仔細研究了一下,算是補上當時的偷懶吧。
在cmake裡面,find_package是有相應的查詢順序的,首先cmake會在模組路徑下進行查詢find.cmake檔案(這個檔名都是這樣的,這裡「」的內容就是find_package裡麵包的名字),具體的查詢路徑為:
1. 變數cmake_module_path中的所有路徑;
2. 查詢cmake自己的模組庫,位置在/usr/share/cmake-x.x/modules裡面;
3. ~/.cmake/packages/或者/usr/local/share/中的各個包目錄下查詢config.cmake(opencv就在這個目錄下);
那麼在上述的過程中,首先我們必須知道說自己要找的模組名字,也就是上述的名字,因為這個決定了find_package裡面模組的名稱;其次就是手動加入查詢的路徑,比如g2o的程式,我們需要手動的將cmake_module資料夾(這個資料夾g2o提供了,裡面有g2o,csparse,cholmod模組的.cmake檔案)加入到查詢路徑中,一般使用如下語句把路徑加入到查詢鍊錶中
我們知道,find_package過後,我們可以通過_found進行是否查詢到模組的判斷,同樣的,如果該標誌位為真,則在整個cmakelists中會產生一些變數,多數部落格講一般產生如下變數:
_found
_include_dirs or
_includes
_libraries or
_libraries or
_libs
_definitions
但是今天發現其實並不是這樣的,甚至有時候name的大小寫都會變化了,那麼具體的變數是什麼呢?還是要從.cmake裡面進行查詢,這裡以opencv和cholmod為例:
我們先進入到/urs/local/share/opencv/資料夾下,開啟opencvconfig.cmake檔案,我們可以從注釋中看到
我們可以看到,找到opencv模組之後會產生如下變數(這裡列出最常用的):opencv_libs和opencv_include_dirs
所以在cmakelists中我們就要用這兩個變數把opencv的庫檔案和標頭檔案加入進來。
同樣的,我們開啟cholmod的.cmake檔案,可以看到如下程式
可以看到我們在cmakelists需要使用的變數為cholmod_include_dir和cholmod_libraries,跟我的經歷一樣,一旦這個cholmod_include_dir寫成cholmod_include_dirs或者cholmod_include_dir,整個程式就找不到宣告和定義。
所以可以看到,cmake裡面的變數也不是一成不變的,而是根據.cmake檔案的資訊來的。
最近在做專案的時候希望cmake在構建完專案之後可以幫助自己做一些拷貝的事情,自然就看到了這個操作,仔細看了下其實該命令還挺厲害的,基本上構建完成之後或者之前的命令都可以滿足一些基本的需求。
官方的文件如下:
可以看到這個命令有兩種形式,取決於第乙個引數是output還是target
output情況:這種情況還沒有用到,從描述上來看是要輸出乙個檔案,分為幾個不同的情況,感覺比較有用的情況是指定乙個專案生成檔案,可以保證在所有的依賴之前構建。
這次主要總結一下該命令都有哪些候選:
可以看到命令還是很多的,基本滿足正常的複製,刪除,打包和建立等等,其中不乏有對比等的命令,這個地方說實話有點兒蒙,因為這不是shell命令,對比之後是有返回值的還是跟shell一樣使用$?,或者是用生成器中的邏輯比較?以後用到了在進行補充。
1. find_package(name required)中的name不是隨便寫的,而是要根據.cmake前面的模組名字寫的;
2. 模組找到後,起產生的變數也不是一成不變或者有規律的,而是.cmake檔案裡面的變數名;
cmake使用的一些補充
一般使用cmake生成vs專案的時候,要麼生成32位的要麼生成64位的。實驗物件是opencv 因為opencv是開源的,所以就拿它來說事。為編譯32位和64位的opencv庫,我使用cmake分別生成了32位和64位的工程,然後編譯各自的庫,沒有問題,但是每次編譯都需要開啟兩個工程很煩就想在乙個工...
斷點的使用技巧(未完待補充)
在最初的時候不會用斷點,碰到迴圈裡特點條件斷點或者特定條件下檢視物件的狀態屬性時,我會傻傻的的去寫個if語句,然後重新執行,斷點完了後執行,然後再把if和log 刪除,非常低效,其實斷點是可以設定屬性的。斷點有4個屬性可以設定 conditon,就是斷點條件,輸入條件表示式後,當符合條件時斷點才會生...
MySQL知識補充
create unique index 索引名 on 表名 列名 select from 表名 indexed by 強制列名 where 條件 mysql select from 表名 force indexed by 強制列名 where 條件 基本套路 alter.add column.預設新...