【1】CMake基础

CMake是一种跨平台编译工具

CMake主要是编写CMakeLists.txt文件

通过cmake命令将CMakeLists.txt文件转化为make所需的Makefile文件

再用make命令编译源代码生成可执行程序或库文件

【2】示例工程

(1)项目结构

build目录 用来构建项目(编译构建中间文件等)

include目录 放置头文件。myprint.h头文件,其内容如下:

src目录 放置源代码实现文件。myprint.cpp文件,内容如下:

hello.cpp文件,内容如下:

(2)CMake方式编译生成库文件

为了利用CMake将项目编译成动态库提供给其他项目使用:

首先,我们要创建CMakeLists.txt文件,简单来说CMake就是我们把编译信息录入。

cmake命令根据CMakeLists.txt生成编译需要的MakeFile文件。

CMakeLists.txt文件具体内容编写如下:

 # 指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
# 给项目命名
PROJECT(MYPRINT)
# 收集c/c++文件并赋值给变量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表区当前项目录
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)
FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/src/*.c)
# 指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
# 指定生成库文件的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 取变量SRC_LIST_CPP 与 SRC_LIST_C的值
# 指定生成libmyprint 动态库(默认为静态库)
# SHARED指定生成库类型为动态库 STATIC为静态库
ADD_LIBRARY(myprint SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})

编写好CMakeLists.txt文件cd到项目build执行cmake命令,如下图:

将会在build目录下生成Makefile文件

再执行make命令项目就会开始编译,在项目lib目录下生成libmyprint.so文件。

生成的动态库文件怎么去链接使用呢?

(3)CMake方式链接使用库文件

直接在src目录下新建 源文件hello.cpp来应用libmyprint.so库

重新编写CMakeLists.txt文件,内容如下:

 # cmake版本需求
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
# 工程名称
PROJECT(HELLO)
# SOURCE 将hello.cpp赋值给SOURCE变量
SET(SOURCE ${PROJECT_SOURCE_DIR}/src/hello.cpp)
# 指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
# 指定链接库文件目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
# 将hello.cpp生成可执行文件hello
ADD_EXECUTABLE(hello ${SOURCE})
# 指定hello 链接库myprint
TARGET_LINK_LIBRARIES(hello myprint)

cd到build目录,执行cmake命令,再执行make命令,将在build目录下生成可执行文件hello。

如下图:

执行hello,运行结果:hello world!

Good Good Study, Day Day Up.

顺序 选择 循环 总结

CMake方式编译的更多相关文章

  1. AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

    1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

  2. AS2.2使用CMake方式进行JNI/NDK开发

    之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境, ...

  3. 二、linux-mysql -cmake方式安装mysql 5.5

    1.安装解压cmake包  cmake软件cd /home/oldboy/tools/tar xf cmake-2.8.8.tar.gzcd cmake-2.8.8./configure#CMake ...

  4. [转]Windows中使用命令行方式编译打包Android项目

    http://my.oschina.net/liux/blog/37875 网上很多用Ant来编译打包Android应用的文章,毕竟Ant是纯Java语言编写的,具有很好的跨平台性.今天想写个纯win ...

  5. CMake 默认编译、链接选项

    查看cmake默认编译和链接的参数设置 CMakeLists.txt 文件内容: cmake_minimum_required(VERSION 3.2) message(STATUS "CM ...

  6. 编译spark源码 Maven 、SBT 2种方式编译

    由于实际环境较为复杂,从Spark官方下载二进制安装包可能不具有相关功能或不支持指定的软件版本,这就需要我们根据实际情况编译Spark源代码,生成所需要的部署包. Spark可以通过Maven和SBT ...

  7. 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

    目录 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用) 背景 下载地址 仓库地址 安装部署 msys2 安装 配置环境变量 ...

  8. (原)linux下利用cmake来编译jthread开源库

    其实上次在用hisi3531平台的时候,就已经编译过一次这个库了,这次换了平台环境,交叉编译器变成了arm-hisiv100-linux-工具链,所以,没办法只能重新来过. 因为之前编译过,所以这次还 ...

  9. ubuntu下cmake自动化编译的一个例子

    一个CMakeLists.txt的例子参考:https://www.hahack.com/codes/cmake/https://blog.csdn.net/afei__/article/detail ...

随机推荐

  1. 点击除指定区域外的空白处,隐藏div

    <script> $(document).click(function (e) { var $target = $(e.target); //点击.zanpl和.quanzipl以外的地方 ...

  2. centos7.2下安装mysql5.7数据库

    服务器上的mysql安装了一个8.0.12版本的,本地的是一个5.7版本的,今天删除了重新安装的5.7版本的,下面是所有的名命令 跟着走就会安装上了.   配置源 wget http://dev.my ...

  3. HeadFirst设计模式---简单工厂

    简单工厂的理解 简单工厂不是设计模式的一种,只是代码规范而且.也就是说构造一个披萨工厂出来,按不同味道生产不同的披萨. 类图 抽象披萨 public abstract class AbstractPi ...

  4. Asp.Net六大内置对象

    前面学习mvc管道处理模型的时候,我们晓的HttpContext是贯穿全文的一个对象,在HttpRuntime产生,现在我们所谓的Asp.Net六大内置对象,其实就是HttpContext的属性.具体 ...

  5. 如何解决phpMyAdmin缺少mcrypt 扩展

    出现问题:在安装配置phpMyAdmin管理mysql数据库的时候,打开phpMyAdmin登录页面,出现下面的错误提示: 缺少 mcrypt 扩展.请检查 PHP 配置 以CentOS 6.0系统为 ...

  6. 201871010102-常龙龙《面向对象程序设计(java)》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. Git的一些概念(二)

    一.Git的结构 二.Git和代码托管中心 代码托管中心的任务:维护远程库 1. 局域网内 GitLab 服务器 -- 可以自己搭建 2. 外部环境 GitHub 码云 三.本地库和远程库 1. 团队 ...

  8. NOIP 2012 借教室

    洛谷 P1083 借教室 https://www.luogu.org/problem/P1083 JDOJ 1783: [NOIP2012]借教室 D2 T2 https://neooj.com/ol ...

  9. LG1410 子序列 二分图判定

    问题描述 LG1410 题解 如果\(i<j,a_j \le a_i\),那么他它们不能在一个上升序列中. 于是在\(i,j\)之间建边,看建出来的图是不是二分图即可. \(\mathrm{Co ...

  10. LG4035/BZOJ1013 「JSOI2008」球形空间产生器 高斯消元

    问题描述 LG4035 BZOJ1013 题解 设答案为\((p_1,p_2,p_3,...,p_n)\) 因为是一个球体,令其半径为\(r\),则有 \[\sum_{i=1}^{n}{(a_i-p_ ...