当前位置: 首页 > news >正文

Cmake 使用和交叉编译配置

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Cmake能做什么

CMake 是个跨平台的自动化建构系统,它用组态档控制建构过程的方式和 Unix 的 Make 相似,
是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准
的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一
般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的
软件,CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建
构执行档。CMake 支援 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建
构(二进档在别的目录里)

Cmake 基本使用

cmake_minimum_required(VERSION 2.6)
project(hello)

# 添加头文件路径
include_directories(include/)

# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)

# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})

# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)

文件结构

.
├── build
├── CMakeLists.txt
├── include
├── main.cpp
└── src

注: build 目录不是必须的,主要是因为Cmake生成Makefile时会产生一下临时文件,所以使用了(out-of-place),这样方便管理文件,建议使用(out-of-place)方式,除非你不介意工程目录中多临时文件。

编译时 进入build目录,执行命令(下同)

cmake .. && make

Cmake添加静态库模块

根目录下的 CmakeLists.txt

project(hello)

# 添加头文件路径
include_directories(include/ lib/)
# 添加模块
add_subdirectory(lib)
# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)

# 设置链接
link_libraries(sub)

# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})

# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)

lib模块下的CmakeLists.txt

cmake_minimum_required(VERSION 2.6)

project(sub)

# SHARED表示生产动态库,STATIC表示生成静态库,默认生成静态库
add_library(sub SHARED sub.cpp)

文件结构

├── build
├── CMakeLists.txt
├── include
│   └── add.h
├── lib
│   ├── CMakeLists.txt
│   ├── sub.cpp
│   └── sub.h
├── main.cpp
└── src
    └── add.cpp

进行交叉编译

cmake_minimum_required(VERSION 2.8)
project(hello)

if(${CROSS_COMPILE})
    set(CMAKE_C_COMPILER arm-linux-gcc)
    set(CMAKE_CXX_COMPILER arm-linux-g++)
endif()
# 添加头文件路径
include_directories(include/ lib/)
# 添加模块
add_subdirectory(lib)
# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)

# 设置链接
link_libraries(sub)

# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})

# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)

进入build目录,执行

cmake .. -DCROSS_COMPILE=true

即可生成支持arm-linux编译器的Makefile文件

注: 想要重新生成不带交叉编译的版本,只需删除build下的 CmakeCache.txt,或者 将true 改为false即可
在2.6的版本中Cmake 的if命令不支持true和false,改为1和0即可

最后,相关工程以防止到 码云上了 https://git.oschina.net/hivebc/cmake_hello

工欲善其事必先利其器 不能只做一个码农,多了解其背后原理更为重要。

转载于:https://my.oschina.net/albert2011/blog/880021

相关文章:

  • java基础理论 程序控制流程
  • H3C IRF原理及 配置
  • puppet自动化基础
  • 认识jQuery Mobile?
  • idea maven 创建webapp项目卡
  • ES5中新增的Array方法,IE8及以下不支持,解决办法,大神链接
  • Java中The project cannot be built until build path errors are resolved错误解决方法
  • TortoiseSVN菜单项功能说明
  • npm 查看模块全部版本
  • vue2.0 开发实践总结之入门篇
  • POJ 2472 106 miles to Chicago
  • 团队作业3——需求改进系统设计
  • 如何在淘宝上利用信息差赚钱
  • Docker入门(二) - Dockerfile
  • Delphi XE以后的版本 程序如何瘦身
  • 30天自制操作系统-2
  • gops —— Go 程序诊断分析工具
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS 面试题总结
  • laravel5.5 视图共享数据
  • mysql innodb 索引使用指南
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • SOFAMosn配置模型
  • Solarized Scheme
  • Theano - 导数
  • vue 个人积累(使用工具,组件)
  • 代理模式
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 经典排序算法及其 Java 实现
  • 离散点最小(凸)包围边界查找
  • 在weex里面使用chart图表
  • hi-nginx-1.3.4编译安装
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二十三)Flask之高频面试点
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)OpenStack Hacker养成指南
  • .NET4.0并行计算技术基础(1)
  • .NET导入Excel数据
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /etc/skel 目录作用
  • @31省区市高考时间表来了,祝考试成功
  • @FeignClient注解,fallback和fallbackFactory
  • [20180224]expdp query 写法问题.txt
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [C++提高编程](三):STL初识