⑴ CMake構建多目錄編譯, 如果希望一旦出現編譯錯誤則停止編譯, 應該怎麼做
1由於之前我是用過CMake生成簡單的PCL程序,在cmd下都是運行成功的,所以CMake應該是沒問題的。2PCL的源碼我下載之後,我直接解壓到CMake的源文件路徑里,這也應該沒什麼問題啊。3第三方庫,我也都下了官網推薦的版本,也沒什麼問題啊,都是安裝到默認的文件夾中。CMake編譯仍然存在錯誤FoundOpenMPBoostversion:1.47.:systemfilesystemthreaddate_timeiostreams
⑵ cmake很簡單的故障問題,怎麼解決
1.開始的時候著實折騰了好長時間,一直以為是代碼的問題,所以就在代碼中進行了跟蹤,結果怎麼都找不到問題,後來就是這份代碼,直接make後,替換原有的系統的協議庫,發現代碼沒有問題,排除了代碼問題。這個問題花時間很久大概有一天時間。
2.發現是編譯方式不同導致的問題後,對兩個文件進行了對比,發現使用Cmake編譯出來的可執行文件是「no stripped」,以為是這個原因,後來就解決strip可執行文件的問題,在網上又是一頓狂找,最終使用「add_custom_command」定製命令的方式得到了解決,滿心歡喜的看到所有應用文件都stripped了,滿心以為這下可好了,但是替換以後仍然通訊異常,這個過程大概花了半天時間。
3.問題得不到解決很郁悶,繼續對比兩個文件的差異,發現即使是stripped以後,使用CMake編譯出來的的文件仍然比直接使用Makefile文件make出來的文件要大不少,這些得到了一些啟示,去看了下Makefile文件。通過查看Makefile和對比CMakeLists.txt文件發現,Makefile中的編譯採用的宏控制,輸出的是Release版本,而CMakeLists.txt中默認的輸出Debug版本。找到問題所在了以後,直接又從網上找到「SET(CMAKE_BUILD_TYPE Release ON)」的方式進行了Release版本設置。
4.後來還發現CMakeLists.txt中的編譯選項也是採用的默認方式,而Makefile中卻有使用,所以乾脆就直接將編譯選項也直接拿過來。
SET(CMAKE_C_FLAGS "-O2 -pipe -fPIC -Wall -fmessage-length=0")
SET(CMAKE_CXX_FLAGS "-O2 -pipe -fPIC -Wall -fmessage-length=0")
5.然後直接進行了編譯,看到編譯後的應用果然文件大小又小了很多,這下覺得沒有問題了,進行整體更換,reboot系統,查看模擬器與設備的通訊情況,正常。ok,這一天算是沒有白費,將正常後的CMakeLists.txt都更新到svn中。
⑶ cmake使用方法(詳細)
例子
在 cmake 腳本中,設置編譯選項可以通過 add_compile_options 命令,也可以通過 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。
使用這兩種方式在有的情況下效果是一樣的,但請注意它們還是有區別的:
例子
也可以直接在編譯的時候指定:
語法
待補充
語法
在CMake中基礎的數據形式是字元串。CMake也支持字元串列表。
列表通過分號分隔。譬如兩個聲明給變數VAR設同樣的值:
字元串列表可以通過foreach命令迭代或直接操控列表命令。
CMake 支持簡單的變數可以是字元串也可以是字元串列表。變數參考使用 ${VAR} 語法。多參數可以使用 set 命令組合到一個列表中。所有其他的命令
通過空白分隔符傳遞命令來擴展列表,例如
像大多數語言一樣,Cmake 提供了控制流結構。Cmake提供了三中控制流:
更多控制流信息參見命令 if,while,foreach,macro,function文檔。
在CMake中原義字元串用雙引號括起來。字元串可以是多行字元串,並在其中嵌入新的行。例如
也可以在一個字元串中轉義字元和使用變數
同樣支持標准C中的轉義
如果字元在引號之前是空格則原義字元串只是原義字元串。但是引號必須成對,例如
cmake可以使用正則表達式
cmake project 頭文件必須存在這行命令, 例如 cmake_minimum_required(VERSION 3.10)
設置項目名稱 project(Tutorial)
語法
例子
語法
將指定的源文件(CPP文件)生成鏈接文件,然後添加到工程中去。
語法
其中 <name> 表示庫文件的名字,該庫文件會根據命令里列出的源文件來創建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的庫文件的類型。
例子
在子文件夾添加了 library 或者 executable 之後,在上層目錄添加 subdirectory , 也可以在同一個CMakeList.txt中使用
它相當於 g++ 選項中的 -I 參數的作用,也相當於環境變數中增加路徑到CPLUS_INCLUDE_PATH變數的作用。
語法:
它相當於 g++ 命令的 -L 選項的作用,也相當於環境變數中增加 LD_LIBRARY_PATH 的路徑的作用。
語法:
語法:
該指令的作用主要是指定要鏈接的庫文件的路徑,該指令有時候不一定需要。因為find_package和find_library指令可以得到庫文件的絕對路徑。不過你自己寫的動態庫文件放在自己新建的目錄下時,可以用該指令指定該目錄的路徑以便工程能夠找到。
語法:
link_libraries(library1 <debug | optimized> library2 ...)
可以鏈接一個,也可以多個,中間使用空格分隔.
語法:
語法:
簡單的例子如下:
一般情況下, make install 在不指定 prefix 默認安裝在`/usr/local/bin
⑷ cmake 在Windows 命令行怎麼指定編譯器
CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。
通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。
總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。
准備活動:
(1)安裝cmake。
下載地址:http://www.cmake.org/cmake/resources/software.html
根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。
Windows下CMake的使用
(2)運行cmake的方法。(GUI、命令行)
http://www.cmake.org/cmake/help/runningcmake.html
CMake使用步驟:
運行GUI的cmake界面:
cmake-2.8.1-win32-x86\bin\cmake-gui.exe
Windows下CMake的使用
執行Configure:
運行之後,生成了如下文件:
Windows下CMake的使用
生成Makefile:
執行Generate之後生成如下文件:
Windows下CMake的使用
運行make進行編譯:
Windows下CMake的使用
編譯完成後,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
Windows下CMake的使用
運行make install安裝程序:
Windows下CMake的使用
運行make test進行測試:
Windows下CMake的使用
通過cmake tutorial學習CMake配置方法
http://www.cmake.org/cmake/help/cmake_tutorial.html
可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。
Windows下CMake的使用
1、Step1。
(如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面「CMake使用步驟」的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
簡單的程序編譯。
(1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。
Windows下CMake的使用
(2)點擊Configure,配置成功後,再點擊Generate。
配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
Windows下CMake的使用
(3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>make
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial
可以運行一下Turorial.exe:
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe
Tutorial.exe Version 1.0
Usage: Tutorial.exe number
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe 4
The square root of 4 is 2
2、Step2
把子目錄編譯為庫,並且鏈接到最終的可執行文件。
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
產生makefile:
在GUI上點擊Configure,之後Generate還是灰色,再次點擊Configure,Generate就可以點擊了。
編譯:
⑸ 編譯安裝cmake時的問題怎麼解決
使用opencv需要編譯源碼,得到庫文件。可以用cmake構建項目後編譯,也可以直接用官方提供的編譯好的版本。 官方提供的編譯庫一般只是標准版本,沒有附加某些庫,比如tbb等,要想讓opencv使用tbb等庫,就只能自己構建項目後編譯。 當然,一般使用的話,用官方提供的庫即可。OpenCV2.3.1版本就提供編譯好的庫,可以直接設置使用。
⑹ CMake 編譯報一堆「注意:包含文件」的問題
原始鏈接:https://my.oschina.net/krysl/blog/5140847
以VS2010為例,找到對應的「clui.dll」,如:「C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\2052\clui.dll」
使用ResourceHacker(「http://www.angusj.com/resourcehacker/」),以管理員方式運行,打開「clui.dll」
將「注意:包含文件」替換為:「Note: including file:」
Action=>Compile Script,然後保存修改的dll,備份原來版本後,替換即可
⑺ cmake 預編譯
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_BOOST=/usr/local/boost \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8
⑻ 如何使用CMake進行交叉編譯
cmake交叉編譯配置
很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。
CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
toolChain腳本中設置的幾個重要變數
1.CMAKE_SYSTEM_NAME:
即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.
2. CMAKE_C_COMPILER:
顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。
3. CMAKE_CXX_COMPILER:
同上,此時代表的是C++編譯器。
4. CMAKE_FIND_ROOT_PATH:
指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。
9. QT_QMAKE_EXECUTABLE:
對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。
⑼ cmake 添加編譯選項的幾種方式
This is initialized for each language from environment variables:
Flags for language <LANG> when building for the <CONFIG> configuration.
SET(CMAKE_C_FLAGS_DEBUG "-g -D_DEBUG -O0")
SET(CMAKE_C_FLAGS_RELEASE "-g -DNDEBUG -O3")
SET(CMAKE_CXX_FLAGS_DEBUG "-g -D_DEBUG -O0")
SET(CMAKE_CXX_FLAGS_RELEASE "-g -DNDEBUG -O3")
⑽ cmake中修改默認編譯器的兩個問題
在為交叉編譯工程寫cmake腳本時,可以在腳本里修改默認編譯器的值。這種方法會碰到下面兩個問題
例如,下面是一個經過簡化後的CMakeLists.txt:
cmake+make的輸出如下:
可以看到,set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")命令之後,默認編譯器已經由g++-5.5修改為了g++-4.8,且編譯階段確實也使用的是g++-4.8。但是此時CMAKE_CXX_COMPILER_VERSION的值仍然是5.5。
例如,頂層CMakeLists.txt中的內容如下:
子目錄sub/CMakeLists.txt中只有一行:
cmake就會陷入死循環:
問題1:
問題2:
但是有個更簡單的方法,可以解決以上所有問題:
在第一個project命令前,修改默認編譯器的定義。
例如: