生活
cmake编译 、cmake编译器
2023-04-23 01:26  浏览:39

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编译C/C++程序

CMake Tutorial

CMake Reference

定义程序编译规则

生成可执行文件的最简单版本的 CMakeLists.txt

以上CMakeLists.txt定义的编译规则是将源文件tutorial.c编译成名为 Tutorial 的可执行文件。

一般用法是,新建一个文件夹,一般命名为 build ,在终端进入该文件夹,然后调用 cmake ../ , cmake 会在找到上级目录找到 CMakeLists.txt ,生成 makefile 和一些其它文件。

在 makefile 所在目录,调用 make 命令,会根据 makefile 对程序进行编译生成。

如何使用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动态编译VTK库(QVtkwidget)

在版本问题上大费周章之后,得到如下的成功尝试

软件版本说明:

PCl1.8.1 + VS2017 + Qt5.9.6 + Cmake + Vtk8.0.0

点击Configure后对条目进行处理:(修改完成继续Configure直到没有错误)

1.点击Add Entry添加 

    Name:    CMAKE_DEBUG_POSTFIX 、Type:    STRING 、Value:-gd、Description:空

让vtk的lib最后分为debug版本跟release版本。Debug版本带-gd。Release版本不带-gd,方便区分.

2.勾选BUILD_SHARED_LIBS,这样最后生成的vtk才会有dll跟lib

3.CMAKE_INSTALL_PREFIX设置为你清空的VTK文件夹(为了方便,这里选择的路径为PCL集成的VTK路径)

4.勾选VTK_Group_Qt,这样以后方便在qt里面使用

5.修改Qt5_DIR路径为PATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/lib/cmake/Qt5

6.修改VTK_QT_VERSION:STRING=5,使用Qt5修改相应版本号

7.如出现qmake路径则修改QT_QMAKE_EXECUTABLE:FILEPATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/bin/qmake.exe

完成Configure,不出意外就不再显示红色,接着点Generate

接着以管理员身份运行VS2017,打开构建目录下的VTK.sln

选择Debug,x64,然后右键解决方案窗口的ALL_BUILD -- 生成。

 漫长等待...ing

然后右键install -- 仅生成install

Release版本同理,先ALL_BUILD -- 生成 再 右键install -- 仅生成install

至此完成编译VTK操作,接下来提取所需的QVtkwidget插件

cmake编译后能给vs使用吗

C++项目很多都是基于CMake进行组织管理的,自2017年起VS支持cmake项目的直接编译后,对于小型项目,我们可以直接在vs中管理CMake工程,方便我们学习。下面以武汉大学牛小骥老师课题组开源组合导航程序KF-GINS为例说明。

1:打开VS2022 选择:继续但无需代码,如下图

2:选择文件—打开——CMake,如下图

3:选择要打开的cmake项目,选择最上层的CMakeLists.txt文件,如下图

打开完成后进入如下页面,工程被编译,可以选择打开CMake设置编辑器,打开类似于CMAKE-GUI的配置界面,也可以在项目栏点击“CMakeSettings.json”打开,进行相应设置

选择Debug模式,重新生成

4:选择启动项,选择Debug模式下生成的exe文件即可进行调试

调试如下:

c++

华为新品发布会即将开启,快来领取你的专属优惠券吧!

精选推荐

广告

Visual Studio 2022编译CMake工程

5421阅读·0评论·1点赞

2022年2月16日

如何在 VS Code 中编译和调试 CMake 项目

1489阅读·0评论·1点赞

2022年8月31日

Windows10中使用VS2022和Cmake编译构建C++开源日志库-spdlog

890阅读·0评论·1点赞

2022年11月19日

VS2022 + Cmake 开发Qt6

1279阅读·0评论·0点赞

2022年6月25日

使用CMake生成sln项目和VS工程遇到的问题

3.1W阅读·2评论·7点赞

2015年3月4日

VS Code安装和使用CMake工具

1997阅读·0评论·1点赞

2020年11月14日

超真实的荒岛生存体验,开局就送SSS级地狱级武器!

精选推荐

广告

windows下Cmake配置vs2022工程

4317阅读·7评论·3点赞

2022年6月18日

vs 打开cmake

2152阅读·0评论·0点赞

2021年8月20日

使用VS自带的命令行编译CMAKE项目

2193阅读·0评论·2点赞

2022年4月13日

Visual Studio 2022 在Windows上编译调试WSL2 CMake跨平台Linux工程

3757阅读·3评论·2点赞

2021年12月26日

VS中的cmake

178阅读·0评论·0点赞

关于cmake编译和cmake编译器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论
0评