当前位置:首页 » 编程软件 » 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”系统是分开的,而且更为高级。

热点内容
刀片机服务器ip怎么配置 发布:2024-05-12 04:28:35 浏览:525
存储系列视频 发布:2024-05-12 04:01:27 浏览:147
oracle数据库去重 发布:2024-05-12 04:00:53 浏览:772
配置减肥餐需要哪些条件 发布:2024-05-12 03:56:36 浏览:513
电视节目需要什么配置电脑 发布:2024-05-12 03:51:26 浏览:44
安卓怎么设置不被拦截 发布:2024-05-12 03:51:26 浏览:567
python目录下的文件名 发布:2024-05-12 03:51:02 浏览:103
c语言怎么编译输出满屏的爱心 发布:2024-05-12 03:39:22 浏览:181
androidlistview间距 发布:2024-05-12 03:39:19 浏览:3
原配置明信片和加购款有什么不同 发布:2024-05-12 03:37:56 浏览:936