2024年10月cmake指定编译器(cmake里哪个是dev c++的编译器)

 更新时间:2024-10-12

  ⑴cmake指定编译器(cmake里哪个是devc++的编译器

  ⑵cmake里哪个是devc++的编译器

  ⑶CMake是一个跨平台的安装(编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是CMake的组态档取名为CMakeLists.txt。Cmake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或WindowsVisualC++的projects/workspaces,然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake和SCons等其他类似系统的区别之处。下载cmakeWindows版本安装直接运行EXELINUX版本的安装:安装cmakecmake-*.*.*tar.gz为下载下来的源码包tarxvfcmake-*.*.*.tar.gzcdcmake-*.*.*如果已经安装了cmake,想要安装新版本,则:cdcmake-*.*.*cmake.makemakeinstall

  ⑷cmake在Windows命令行怎么指定编译器

  ⑸可以使用cmake--version查看如果输出cmake的版本号说明已经正确安装了cmake如果提示没有cmake这个命令

  ⑹cmake在Windows命令行怎么指定编译器

  ⑺比如:D: emp》cmakeCmakeList.txt-G“VisualStudio“

  ⑻CMAKE_RC_PILER是什么东西

  ⑼cmakevsqmakeqmake是为Qt量身打造的,使用起来非常方便cmake使用上不如qmake简单直接,但复杂换来的是强大的功能内置的out-ofsource构建。(目前QtCreator为qmake也默认启用了该功能,称:shadowbuild为各种平台和场景提供条件编译可处理多个可执行文件情况,和很好配合QtTest工作如何选择?UsingCMaketoBuildQtProjects一文中说:对简单的Qt工程,采用qmake对复杂度超过qmake处理能力的,采用cmake尽管如此,如果简单Qt的工程都不知道怎么用cmake构建,复杂的工程,就更不知道如何使用cmake了。还是从简单的学起吧简单的Qt程序#include《QtCore/QCoreApplication》#include《QtCore/QDebug》intmain(intargc,char**argv){QCoreApplicationapp(argc,argv);qDebug()《《“helloqt!“;app.exec();}如果不使用构建工具,直接调用编译器来编译的话,只需要类似这样的一条命令:g++main.cpp-Ie:Qt..include-omain-Le:Qt..lib-lQtCore指定头文件目录,以及需要链接的库qmakeqmake需要一个.pro文件:CONFIG+=qtQT-=guiSOURCES+=main.cpp因为我们需要Qt的库和头文件,所以需要CONFIG+=qt。这是默认项,可直接去掉该行启用qt后,可以通过QT-=gui来进一步细调我们需要的模块默认是coregui。我们不需要gui模块,故去掉。cmakecmake需要一个CMakeLists.txt文件:PROJECT(example)FIND_PACKAGE(QtREQUIRED)SET(QT_DONT_USE_QTGUITRUE)INCLUDE(${QT_USE_FILE})ADD_EXECUTABLE(examplemain.cpp)TARGET_LINK_LIBRARIES(example${QT_LIBRARIES})FIND_PACKAGE来启用Qt默认使用了core和gui,故手动禁用QTGUI这两行可以直接使用FIND_PACKAGE(QtPONENTSQtCoreREQUIRED),未指定的模块将被禁用包含一个CMake为Qt提供的配置文件,${QT_USE_FILE}变量是一个文件名添加可执行程序目标链接到Qt的库复杂一点考虑一个常规Qt程序:main.cppmainwindows.uimainwindows.hmainwindows.cpp如果手动编译的话:mainwindow.ui需要使用uic预处理uicmainwindow.ui-oui_mainwindow.hmainwindow.h需要moc预处理mocmainwindow.h-omoc_mainwindow.cpp调用编译器进行编译g++main.cppmainwindow.cppmoc_mainwindow.cpp-Ie:Qt..include-omain-Le:Qt..lib-lQtCore-lQtGuiqmake使用qmake的的话,一个简单的pro文件TARGET=exampleTEMPLATE=appSOURCES+=main.cppmainwindow.cppHEADERS+=mainwindow.hFORMS+=mainwindow.uiHEADERS中的文件是否需要moc进行预处理,qmake运行时会根据其是否含有Q_OBJECT自动判断。这也是为什么很多人添加Q_OBJECT宏后不重新运行qmake会出错误的原因。cmake看看相应的cmake的CMakeLists.txt文件PROJECT(example)CMAKE_MINIMUM_REQUIRED(VERSION.)FIND_PACKAGE(QtREQUIRED)INCLUDE(${QT_USE_FILE})INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})QT_WRAP_CPP(example_MOCSmainwindow.h)QT_WRAP_UI(example_UISmainwindow.ui)ADD_EXECUTABLE(examplemain.cppmainwindow.cpp${example_MOCS})TARGET_LINK_LIBRARIES(example${QT_LIBRARIES})需要moc的文件,用QT_WRAP_CPP处理生成的文件放入变量example_MOCS中,最后一块链接到可执行程序需要uic的文件,用QT_WRAP_UI处理Windows因为windows下链接时分为console和windows两个子系统,所以windows下有些问题需要特殊处理。用qmake时:默认是windows子系统可以通过CONFIG+=console使用console子系统用cmake是:默认是console子系统使用windows子系统需要SET(QT_USE_QTMAINTRUE)ADD_EXECUTABLE(exampleWINmain.cppmainwindow.cpp${example_MOCS})前者启用qtmain.lib库来提供windows下的WinMain入口函数。后者链接windows子系统再复杂一点main.cppmainwindows.uimainwindows.hmainwindows.cppmain.qrcmain.rc前面已经用到了Qt的moc和uic,这次增加了资源系统需要用rrmain.qrc-oqrc_main.cpp同时,使用了windows下的资源文件.rc(比如给程序添加图标)MVSC中使用rc.exe对.rc文件进行处理MinGW中使用windres.exe处理.rc文件qmakeTARGET=exampleTEMPLATE=libHEADERS=mainwindow.hwidget.hSOURCES=main.cppwidget.cppmainwindow.cppRESOURCES=main.qrcRC_FILE=main.rmakePROJECT(example)CMAKE_MINIMUM_REQUIRED(VERSION.)FIND_PACKAGE(QtREQUIRED)SET(QT_USE_QTMAINTRUE)INCLUDE(${QT_USE_FILE})INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})if(MINGW)set(CMAKE_RC_PILER_INITwindres)ENABLE_LANGUAGE(RC)SET(CMAKE_RC_PILE_OBJECT“《CMAKE_RC_PILER》《FLAGS》-Ocoff《DEFINES》-i《SOURCE》-o《OBJECT》“)endif(MINGW)SET(example_SRCSmain.cppmainwindow.cppwidget.cppres/main.rc)SET(example_MOC_SRCSmainwindow.hwidget.h)QT_WRAP_CPP(example_MOCS${example_MOC_SRCS})QT_ADD_RESOURCES(example_R_SRCSmain.qrc)SET(example_SRCS${example_SRCS}${example_MOCS}${example_R_SRCS})ADD_EXECUTABLE(exampleWINmain.cppmainwindow.cpp${example_SRCS})TARGET_LINK_LIBRARIES(example${QT_LIBRARIES})对Qt的资源文件,使用QT_ADD_RESOURCES来调用r进行预处理对Windows资源文件,直接和源文件一样,添加到列表中即可。只是:MinGW下仅仅这么做还不行,上面的MinGW块用来修复这个问题Debug与Releaseqmake使用qmake时,可以在pro文件内分别为两种模式设置不同的选项。使用时,可以直接makerelease或makedebug来编译不同的版本cmake不同于qmake,由于cmake采用out-of-source方式。故:建立debugrelease两目录,分别在其中执行cmake-DCMAKE_BUILD_TYPE=Debug(或Release需要编译不同版本时进入不同目录执行make对生成msvc工程的情况,CMAKE_BUILD_TYPE不起作用。生成工程后使用IDE自带的模式选择。

  ⑽cmake中修改默认编译器的两个问题

  ⑾在为交叉编译工程写cmake脚本时,可以在脚本里修改默认编译器的值。这种方法会碰到下面两个问题例如,下面是一个经过简化后的CMakeLists.txt:cmake+make的输出如下:可以看到,set(CMAKE_CXX_PILER“/usr/bin/g++-.“)命令之后,默认编译器已经由g++-.修改为了g++-.,且编译阶段确实也使用的是g++-.。但是此时CMAKE_CXX_PILER_VERSION的值仍然是.。例如,顶层CMakeLists.txt中的内容如下:子目录sub/CMakeLists.txt中只有一行:cmake就会陷入死循环:问题:问题:但是有个更简单的方法,可以解决以上所有问题:在第一个project命令前,修改默认编译器的定义。例如:

  ⑿Cmake是什么有什么作用为什么要使用Cmake

  ⒀CMake是一个跨平台的安装(编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。作用是他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

  ⒁只是CMake的组态档取名为CMakeLists.txt。Cmake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或?Windows?VisualC++?的projects/workspaces,然后再依一般的建构方式使用。

  ⒂这使得熟悉某个集成开发环境(IDE的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake和SCons等其他类似系统的区别之处。

  ⒃CMake是为了解决美国国家医学图书馆出资的VisibleHumanProject专案下的InsightSegmentationandRegistrationToolkit(ITK软件的跨平台建构的需求而创造出来的,其设计受到了KenMartin开发的pcmaker所影响。pcmaker当初则是为了支持VisualizationToolkit这个开放源代码的三维图形和视觉系统才出现的,VTK也采用了CMake。

  ⒄cmake在Windows命令行怎么指定编译器

  ⒅CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(makeinstall、测试安装的程序是否能正确执行(maketest,或者ctest、生成当前平台的安装包(makepackage、生成源码包(makepackage_source、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。总之,CMake是一个非常强大的编译自动配置工具,支持各种平台,KDE也是用它编译的,感兴趣的可以试用一下。准备活动:(安装cma编译:

  ⒆visualstudio编译器的堆空间不足问题的解决(cmake版本)

  ⒇我们有个自动编译游戏引擎的脚本,这个脚本时间用久了,总是会报如下的错误:fatalerrorC:编译器的堆空间不足每次出现这种错误,总是要请人重启机器,重新配置,很耽误时间和精力。所以本人就在努力寻找一个彻底的解决办法。想直接要解决方法的朋友可以跳过接下来的两节。简单网上搜一下,就能搜到参考文献。如果你的c++工程不用cmake,参考文献的方法足以满足你的需求。但是我们工程比较大,肯定是要用cmake的,所以我就开始尝试各种方法:通过改工程的cmake文件的方式来让cmake生成的vcxproj工程文件中包含PreferredToolArchitecture属性。网上找了好久,试了不少办法,还是没用。发现最终解决方案也是个很有趣的过程,值得记录。首先我看见PreferredToolArchitecture父节点是PropertyGroup,而PropertyGroup下面有Platform属性,PreferredToolArchitecture和Platform是兄弟属性。我们的Platform用x还是win,都是在cmake命令行里指定的。所以我就大胆猜测,PreferredToolArchitecture这个属性如果可以通过cmake设置的话,大概率也是在cmake的命令行中设置!接着,就是小心求证的过程,先执行:cmake--help通过阅读帮助文档,辅以简单的排除法,我觉得toolset-name这个属性很可能是我要的,于是谷歌:cmaketoolsetname从而找到了文档,在文档中发现了host=x这个东西,但是我还不知道怎么用!于是继续搜索:cmakehost=x找到了文档,然后修改我们的编译脚本,加入这个编译选项,重新cmake,果然,出现了vcxproj文件中看到了PreferredToolArchitecturex属性!感觉成功了%,编译工程,打开任务管理器,观察进程名称,发现c++编译器都是位的,遂大功告成。问题的本质就是windows操作系统visualstudio的默认cpp编译器是位的,所以最大内存是G,就容易导致编译器内存不足。有问题的cmake指令如下:使用位的cpp编译器的解决方法如下:注意:cmake的GUI并没有-Thost的选择,当然最新版的GUI可能也会加这个。。还有另一种方法,添加环境变量:setPreferredToolArchitecture=x虽然用了位的cpp编译器,过了一段时间,还是报堆空间不足的问题。据观察,物理内存占用率%,所以考虑利用空闲的磁盘空间,增大机器的虚拟内存。win如何设置虚拟内存的大小:物理内存只有G,以前的虚拟内存是G,我利用空闲磁盘,增大虚拟内存到G!

  ⒈怎么配置cmakelist交叉编译

  ⒉cmake交叉编译配置很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作。CMake给交叉编译预留了一个很好的变量CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_PILER,CXX_PILER,如果用Qt的话需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的话需要更改的BOOST_ROOT(具体查看相关Findxxx.cmake里面指定的路径)。CMake为了不让用户每次交叉编译都要重新输入这些命令,因此它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你需要改变以及需要set的所有交叉环境的设置。toolChain脚本中设置的几个重要变量.CMAKE_SYSTEM_NAME:即你目标机target所在的操作系统名称,比如ARM或者Linux你就需要写“Linux“,如果Windows平台你就写“Windows“,如果你的嵌入式平台没有相关OS你即需要写成“Generic“,只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSPILING为TRUE..CMAKE_C_PILER:顾名思义,即C语言编译器,这里可以将变量设置成完整路径或者文件名,设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具比如linker,binutils等,如果你写的文件名带有arm-elf等等前缀,CMake会识别到并且去寻找相关的交叉编译器。.CMAKE_CXX_PILER:同上,此时代表的是C++编译器。.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将会在那里查找。.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:对FIND_LIBRARY()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的..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.BOOST_ROOT:对于需要boost库的用户来说,相关的boost库路径配置也需要设置,因此这里的路径即ARM下的boost路径,里面有include和lib。.QT_QMAKE_EXECUTABLE:对于Qt用户来说,需要更改相关的qmake命令切换成嵌入式版本,因此这里需要指定成相应的qmake路径(指定到qmake本身toolChaindemo#thisisrequiredSET(CMAKE_SYSTEM_NAMELinux)#specifythecrosspilerSET(CMAKE_C_PILER/opt/arm/usr/bin/ppc_xx-g)SET(CMAKE_CXX_PILER/opt/arm/usr/bin/ppc_xx-g++)#whereisthetargetenvironmentSET(CMAKE_FIND_ROOT_PATH/opt/arm/ppc_xx/home/rickk/arm_inst)#searchforprogramsinthebuildhostdirectories(notnecessary)SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAMNEVER)#forlibrariesandheadersinthetargetdirectoriesSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDEONLY)#configureBoostandQtSET(QT_QMAKE_EXECUTABLE/opt/qt-embedded/qmake)SET(BOOST_ROOT/opt/boost_arm)这样就完成了相关toolChain的编写,之后,你可以灵活的选择到底采用宿主机版本还是开发机版本,之间的区别仅仅是一条-DCMAKE_TOOLCHAIN_FILE=更爽的是,如果你有很多程序需要做转移,但目标平台是同一个,你仅仅需要写一份toolChain放在一个地方,就可以给所有工程使用。

  ⒊如何检测c++支持带有cmake的编译器

  ⒋直接测试新写法:viewplaincopy《prename=“code“class=“plain“》#CMakeLists.txtproject(test)cmake_minimum_required(VERSION.)aux_source_directory(.SRC_LIST)add_executable(${PROJECT_NAME}${SRC_LIST})include(CheckCXXpilerFlag)CHECK_CXX_PILER_FLAG(“-std=c++“PILER_SUPPORTS_CXX)CHECK_CXX_PILER_FLAG(“-std=c++x“PILER_SUPPORTS_CXXX)if(PILER_SUPPORTS_CXX)set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-std=c++“)elseif(PILER_SUPPORTS_CXXX)set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-std=c++x“)else()message(STATUS“Thepiler${CMAKE_CXX_PILER}hasnoC++support.PleaseuseadifferentC++piler.“)endif()测试c++代码viewplaincopy//test.#include《iostream》#include《vector》usingnamespacestd;intmain(){conststd::vector《int》v();autoa=v;//a为int类型cout《《“a:“《《a《《endl;decltype(v(size_typeconst的返回类型autoc=;//c为int类型autod=c;//d为int类型decltype(c)e;//e为int类型,c实体的类型decltype((c))f=e;//f为int&类型,因为(c是左值decltype()g;//g为int类型,因为是右值return;}所以,不同版本的g给指定c++支持设定了不同的标志,也就说老版本支持-std=c++x的写法,新版本用-std=c++的写法。以上程序就是判断本机的g++该使用那种输出版本。

您可能感兴趣的文章:

相关文章