當前位置:首頁 » 編程軟體 » qt編譯cmake

qt編譯cmake

發布時間: 2022-06-23 02:43:44

Ⅰ 如何使用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放在一個地方,就可以給所有工程使用。

Ⅱ 直接用Qt creator 與用cmake 有什麼不同

您好,我來為您解答:
雖然qtcreator是輕量級的編譯工具,但在一定程度上,用cmake效果更好,更快,特別是大型的項目,cmake編譯得更快。
希望我的回答對你有幫助。

Ⅲ QT5.7.1 的CMake Wizard 在哪裡,

CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名為 CmakeLists.txt。

Ⅳ OSX系統用QT編譯cmakelist文件時出錯 在這無限循環

Qt在編譯時,需要首先使用uic.exe編譯UI文件,通過moc.exe處理Q_OBJECT之類的宏,當然你可以去掉這些定義,否則就需要加上:#COMPILEUIsSET(UISmnwindow)FOREACH(ui_file${UIS})SET(TMP_IN"${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")SET(TMP_OUT"${PROJECT_BINARY_DIR}/ui_${ui_file}.h")EXECUTE_PROCESS(COMMAND${QT_FOLDER}/bin/uic.exe-o${TMP_OUT}${TMP_IN})MESSAGE(STATUS"EXEC=${QT_FOLDER}/bin/uic.exe-o${PROJECT_BINARY_DIR}/ui_${ui_file}.h${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")ENDFOREACH(ui_file)#CREATEMOCSET(HEADERSmainwindow)FOREACH(header_file${HEADERS})SET(TMP_IN"${PROJECT_SOURCE_DIR}/inc/${header_file}.h")SET(TMP_OUT"${PROJECT_BINARY_DIR}/moc_${header_file}.cpp")EXECUTE_PROCESS(COMMAND${QT_FOLDER}/bin/moc.exe-o${TMP_OUT}${TMP_IN})SET(MOCS${MOCS}${PROJECT_BINARY_DIR}/moc_${header_file}.cpp)MESSAGE(STATUS"EXEC=${QT_FOLDER}/bin/moc.exe-o${PROJECT_BINARY_DIR}/moc_${header_file}.cpp${PROJECT_SOURCE_DIR}/inc/${header_file}.h")ENDFOREACH(header_file)freec#.netqrcreator這里要注意的是:EXECUTE_PROCESS在COMMAND後面不能加引號,命令直接寫,否則執行的程序也不會出錯,但也不會正常運行.

Ⅳ qt5.7.1配置opencv3.1.0的時候用cmake編譯opencv總是出錯。每一步都是按照網上教程來的,不知道為什麼

看你這提示Qt的安裝包里沒有make程序,你檢查一下bin目錄有make.exe文件么。

Ⅵ Qt執行Cmake時Cmake出現這種情況時為什麼

在Qt Creator中使用OpenCV庫 (Windows 7系統下編譯成功)
編譯OpenCV2.0
1 下載tdm-mingw-1.908.0-4.4.1-2並安裝,安裝完畢添加bin到系統路徑。
2 安裝Opencv2.0 windows版本
3 安裝CMake
4 打開CMake,配置源碼與目標路徑,選擇MinGW Makefiles,生成目標Makefile
5 進入設置好的目標路徑,make,直至生成所有的庫
配置Qt Creator
Qt開發的程序一般需要藉助qmake生成makefile文件。由於qmake在解析路徑的時候不能識別空格, 因此需要確保OpenCV的安裝路徑中不能包含空格(C:/Program Files/OpenCV是不行的)。
在創建工程文件的時候(這里假設為hello.pro,後綴為pro),向工程中添加以下語句:
INCLUDEPATH+=D:/Qt/OpenCV-2.0.0/include/opencv
LIBS+=D:/Qt/OpenCV-2.0.0/lib/libcv200.dll.a/
D:/Qt/OpenCV-2.0.0/lib/libcxcore200.dll.a/
D:/Qt/OpenCV-2.0.0/lib/libml200.dll.a/
D:/Qt/OpenCV-2.0.0/lib/libcvaux200.dll.a/
D:/Qt/OpenCV-2.0.0/lib/libhighgui200.dll.a
這樣,在Qt中就可以使用Opencv 2.0 了

打開CMake,試一下,發現沒法完成configure!原因是CMAKE_MAKE_PROGRAM沒找到,這個簡單,修改該項為D:/Qt/2010.04/mingw/bin(您自個看著改)。
繼續Configure,什麼還出錯?彈出一大堆什麼dll找不到!!
好吧,我直接把D:/Qt/2010.04/mingw/bin放到環境變數中去。
Delete Catch以後再來一次,這下好了,連CMAKE_MAKE_PROGRAM都不用改了,自動找到。成功configure。
然後Generate一下。

Ⅶ QT6用CMAKE編譯沒有PRO文件用QMAKE卻有,正常嗎

這是正常的。因為cmake不需要Pro文件,qmake才需要Pro文件!謝謝,望採納!

Ⅷ linux下的qt能和cmake配合用么

在Qt Creator中使用OpenCV庫 (Windows 7系統下編譯成功) 編譯OpenCV2.0 1 下載tdm-mingw-1.908.0-4.4.1-2並安裝,安裝完畢添加bin到系統路徑。 2 安裝Opencv2.0 windows版本 3 安裝CMake 4 打開CMake,配置源碼與目標路徑,選擇MinGW Makefiles...

Ⅸ cmake在Qt編譯opencv總是出錯,已經弄了一周了,求助大神

是你的編譯器版本不對, You probably need to select a different build tool.
在點擊configure時,會出來一個選擇編譯器的框,你選一個你機器里有的編譯器就可以了。

Ⅹ QT寫opencv一定要用cmake嗎,cmake有什麼用,我不用它也能正常執行項目啊

CMake是個開源的跨平台自動化建構系統,它用配置文件控制建構過程(build process)的方式和Unix的Make相似,只是CMake的配置文件取名為CmakeLists.txt。Cmake並不直接建構出最終的軟體,而是產生標準的建構文件(如Unix的Makefile或Windows Visual C++的projects/workspaces),然後再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構他的軟體,這種可以使用各平台的原生建構系統的能力是CMake和SCons等其他類似系統的區別之處。CMake可以編譯源代碼、製做程序庫、產生適配器(wrapper)、還可以用任意的順序建構可執行文件。CMake支持in-place建構(二進文件和源代碼在同一個目錄樹中)和out-of-place建構(二進文件在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進文件。CMake也支持靜態與動態程序庫的建構。
「CMake」這個名字是"cross platform make"的縮寫。雖然名字中含有"make",但是CMake和Unix上常見的「make」系統是分開的,而且更為高級。

熱點內容
培訓php還是java 發布:2024-04-28 07:10:49 瀏覽:919
dal數據訪問 發布:2024-04-28 07:09:00 瀏覽:521
python判斷伺服器是內網地址 發布:2024-04-28 07:07:17 瀏覽:782
手機qq影音加密 發布:2024-04-28 07:05:27 瀏覽:780
多次編譯仍然啟動不了 發布:2024-04-28 06:33:17 瀏覽:599
絕地求生怎麼調伺服器2020 發布:2024-04-28 06:28:14 瀏覽:803
虛擬主機和輕雲伺服器 發布:2024-04-28 05:34:20 瀏覽:775
電腦伺服器的品牌型號怎麼查 發布:2024-04-28 04:33:06 瀏覽:138
文件上傳ui 發布:2024-04-28 04:07:14 瀏覽:483
我的世界pe登伺服器 發布:2024-04-28 04:05:58 瀏覽:672