如果想要在 cmake 文件中取出这个键值对则需要使用 ${KEY} 的方式

set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)

这里可以设置一个配置文件,我们可以在 TutorialConfig.h.in 中配置 set() 中设置的键值对

PROJECT_SOURCE_DIR 表示的是源代码的路径

PROJECT_BINARY_DIR 表示的是cmake build 的路径

configure_file (
“ P R O J E C T S O U R C E D I R / T u t o r i a l C o n f i g . h . i n " " {PROJECT_SOURCE_DIR}/TutorialConfig.h.in" " PROJECTS​OURCED​IR/TutorialConfig.h.in""{PROJECT_BINARY_DIR}/TutorialConfig.h”
)

将 cmake 的 build 目录添加到cmake 寻找 include 文件的目录列表中,这样一来 cmake 就能找到前面生成的 TutorialConfig.h 配置文件

include_directories("${PROJECT_BINARY_DIR}")

add_executable(Tutorial_A tutorial.cpp)

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// include 了cmake 生成配置文件
#include “TutorialConfig.h”

int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,"%s Version %d.%d\n",
argv[0],
// 使用了 cmake 生成的配置参数
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}

// 这个是配置文件,cmake 会根据他在 cmake 的 build 目录生成一个 TutorialConfig.h 文件
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR

(2).添加库的依赖

  • 1.我们进入项目的 two/a/mylib 中会看见三个文件 CMakeLists.txt、mysqrt.cpp、MathFunctions.h 代码如下:
  • 1.声明了一个 library
  • 2.定义了一个计算平方根的函数,然后使用头文件暴露在外面

cmake_minimum_required (VERSION 2.6)

声明了一个 library 名为 MathFunctions,他包含一个可执行文件 mysqrt.cpp

add_library(MathFunctions mysqrt.cpp)

#include “MathFunctions.h”
#include <stdio.h>

// a hack square root calculation using simple operations
double mysqrt(double x) {
if (x <= 0) {
return 0;
}

double result;
double delta;
result = x;

// do ten iterations
int i;
for (i = 0; i < 10; ++i) {
if (result <= 0) {
result = 0.1;
}
delta = x - (result * result);
result = result + 0.5 * delta / result;
fprintf(stdout, “Computing sqrt of %g to be %g\n”, x, result);
}
return result;
}

//
// Created by 何时夕 on 2018/11/11.
//

#ifndef PROJECT_MATHFUNCTIONS_H
#define PROJECT_MATHFUNCTIONS_H
double mysqrt(double x);
#endif //PROJECT_MATHFUNCTIONS_H

  • 2.然后我们再看看 two/a 这个目录下面的文件,这些文件大部分是从 one/b 中拷贝来的,我就只贴有修改的部分 CMakeLists.txt、Configure.h.in、MathFunctions.h、tutorial.cpp:
  • 1.这里主要做的工作是现在 cmake 文件中定义了一个 USE_MYMATH 的开关,当这个开关为 ON 的时候就将我们定义的 library 集成到 project 中,否则就不集成,只使用系统自带的库。这个东西在跨平台的时候非常有用,比如 ios 和 android 中的 log 库不同,那么我就可以定义一个开关来区别这两个平台。
  • 2.可以注意到的是这里也定义了一个 Configure.h.in 文件作为配置文件,cmake 会根据这个文件来创建一个 Configure.h 文件,然后我们就可以在 Cpp 文件中使用我们定义的开关了。
  • 3.我们可以在 two/a/build 中运行 cmake…、make、./Tutorial_Mylib 3 这几个命令,会发现最终调用的是我们自己的函数,如果将 USE_MYMATH 改成 OFF 然后删除 build 中的文件再重新 build 一遍,会发现最后调用的是系统的函数。

cmake_minimum_required (VERSION 2.6)
project (Tutorial_Mylib)

set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)

configure_file (
“ P R O J E C T S O U R C E D I R / T u t o r i a l C o n f i g . h . i n " " {PROJECT_SOURCE_DIR}/TutorialConfig.h.in" " PROJECTS​OURCED​IR/TutorialConfig.h.in""{PROJECT_BINARY_DIR}/TutorialConfig.h”
)

添加一个是否使用我们自己的库的开关 USE_MYMATH,这个开关可以在 cmake 中直接使用

option (USE_MYMATH
“Use tutorial provided math implementation” ON)

定义一个文件来储存 USE_MYMATH,以便在 cpp 文件中使用

configure_file(" P R O J E C T S O U R C E D I R / C o n f i g u r e . h . i n " " {PROJECT_SOURCE_DIR}/Configure.h.in" " PROJECTS​OURCED​IR/Configure.h.in""{PROJECT_BINARY_DIR}/Configure.h")

include_directories("${PROJECT_BINARY_DIR}")

如果我们把开关设置为 ON,那么就将 mylib 集成进编译中,否则就不集成。

if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/mylib")
add_subdirectory (mylib)
set (EXTRA_LIBS MathFunctions)
endif (USE_MYMATH)

add_executable (Tutorial_Mylib tutorial.cpp)

将library 与 project 进行链接,使得 project 中可以调用 library 中的函数

target_link_libraries (Tutorial_Mylib ${EXTRA_LIBS})

#cmakedefine USE_MYMATH

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include “TutorialConfig.h”
#include “Configure.h”
#ifdef USE_MYMATH
#include “MathFunctions.h”
#endif

int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,"%s Version %d.%d\n", argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}

double inputValue = atof(argv[1]);

#ifdef USE_MYMATH
// 如果开关开了,就使用我自己的库
double outputValue = mysqrt(inputValue);
fprintf(stdout,“use my math”);
#else
double outputValue = sqrt(inputValue);
fprintf(stdout,“not use my math”);
#endif

fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}

(2).添加库的依赖

  • 1.我们进入项目的 two/a/mylib 中会看见三个文件 CMakeLists.txt、mysqrt.cpp、MathFunctions.h 代码如下:
  • 1.声明了一个 library
  • 2.定义了一个计算平方根的函数,然后使用头文件暴露在外面

cmake_minimum_required (VERSION 2.6)

声明了一个 library 名为 MathFunctions,他包含一个可执行文件 mysqrt.cpp

add_library(MathFunctions mysqrt.cpp)

#include “MathFunctions.h”
#include <stdio.h>

// a hack square root calculation using simple operations
double mysqrt(double x) {
if (x <= 0) {
return 0;
}

double result;
double delta;
result = x;

// do ten iterations
int i;
for (i = 0; i < 10; ++i) {
if (result <= 0) {
result = 0.1;
}
delta = x - (result * result);
result = result + 0.5 * delta / result;
fprintf(stdout, “Computing sqrt of %g to be %g\n”, x, result);
}
return result;
}

//
// Created by 何时夕 on 2018/11/11.
//

#ifndef PROJECT_MATHFUNCTIONS_H
#define PROJECT_MATHFUNCTIONS_H
double mysqrt(double x);
#endif //PROJECT_MATHFUNCTIONS_H

  • 2.然后我们再看看 two/a 这个目录下面的文件,这些文件大部分是从 one/b 中拷贝来的,我就只贴有修改的部分 CMakeLists.txt、Configure.h.in、MathFunctions.h、tutorial.cpp:
  • 1.这里主要做的工作是现在 cmake 文件中定义了一个 USE_MYMATH 的开关,当这个开关为 ON 的时候就将我们定义的 library 集成到 project 中,否则就不集成,只使用系统自带的库。这个东西在跨平台的时候非常有用,比如 ios 和 android 中的 log 库不同,那么我就可以定义一个开关来区别这两个平台。
  • 2.可以注意到的是这里也定义了一个 Configure.h.in 文件作为配置文件,cmake 会根据这个文件来创建一个 Configure.h 文件,然后我们就可以在 Cpp 文件中使用我们定义的开关了。
  • 3.我们可以在 two/a/build 中运行 cmake…、make、./Tutorial_Mylib 3 这几个命令,会发现最终调用的是我们自己的函数,如果将 USE_MYMATH 改成 OFF 然后删除 build 中的文件再重新 build 一遍,会发现最后调用的是系统的函数。

cmake_minimum_required (VERSION 2.6)
project (Tutorial_Mylib)

set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)

configure_file (
“ P R O J E C T S O U R C E D I R / T u t o r i a l C o n f i g . h . i n " " {PROJECT_SOURCE_DIR}/TutorialConfig.h.in" " PROJECTS​OURCED​IR/TutorialConfig.h.in""{PROJECT_BINARY_DIR}/TutorialConfig.h”
)

添加一个是否使用我们自己的库的开关 USE_MYMATH,这个开关可以在 cmake 中直接使用

option (USE_MYMATH
“Use tutorial provided math implementation” ON)

定义一个文件来储存 USE_MYMATH,以便在 cpp 文件中使用

configure_file(" P R O J E C T S O U R C E D I R / C o n f i g u r e . h . i n " " {PROJECT_SOURCE_DIR}/Configure.h.in" " PROJECTS​OURCED​IR/Configure.h.in""{PROJECT_BINARY_DIR}/Configure.h")

include_directories("${PROJECT_BINARY_DIR}")

如果我们把开关设置为 ON,那么就将 mylib 集成进编译中,否则就不集成。

if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/mylib")
add_subdirectory (mylib)
set (EXTRA_LIBS MathFunctions)
endif (USE_MYMATH)

add_executable (Tutorial_Mylib tutorial.cpp)

将library 与 project 进行链接,使得 project 中可以调用 library 中的函数

target_link_libraries (Tutorial_Mylib ${EXTRA_LIBS})

#cmakedefine USE_MYMATH

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include “TutorialConfig.h”
#include “Configure.h”
#ifdef USE_MYMATH
#include “MathFunctions.h”
#endif

int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,"%s Version %d.%d\n", argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}

double inputValue = atof(argv[1]);

#ifdef USE_MYMATH
// 如果开关开了,就使用我自己的库
double outputValue = mysqrt(inputValue);
fprintf(stdout,“use my math”);
#else
double outputValue = sqrt(inputValue);
fprintf(stdout,“not use my math”);
#endif

fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}

(3).安装库与可执行文件

  • 1.我们进入项目的 three/a 文件夹中,这里面的文件都是从 two/a 中复制过来的,我只将增加的代码列一下mylib/CMakeLists.txt、a/CMakeLists.txt:
  • 1.这里就比较简单了,就只是将我们生成的库与可执行文件安装到电脑中去
  • 2.先依次运行cmake …、make、make install,然后可以运行 /usr/local/bin/Tutorial_Mylib_Install 3 来查看是否安装成功,注意这里的路径是 Mac 电脑的路径。

安装这个库,将库和头文件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下

/usr/local/bin/libMathFunctions_Install.a

/usr/local/include/MathFunctions.h

install (TARGETS MathFunctions_Install DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

TARGETS包含六种形式:ARCHIVE, LIBRARY, RUNTIME, OBJECTS, FRAMEWORK, BUNDLE。注意Mathfunction_Install安装的是LIBRARY,Tutorial_Mylib_Install 是RUNTIME类型。

FILE 将给定的文件复制到指定目录。如果没有给定权限参数,则由该表单安装的文件默认为OWNER_WRITE、OWNER_READ、GROUP_READ和WORLD_READ。

TARGETS和FILE可指定为相对目录和绝对目录。

DESTINATION在这里是一个相对路径,取默认值。在unix系统中指向 /usr/local 在windows上c:/Program Files/${PROJECT_NAME}。

也可以通过设置CMAKE_INSTALL_PREFIX这个变量来设置安装的路径,那么安装位置不指向/usr/local,而指向你所指定的目录。

安装这个可执行文件,将可执行文件和头文件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下

/usr/local/bin/Tutorial_Mylib_Install

/usr/local/include/TutorialConfig.h

install (TARGETS Tutorial_Mylib_Install DESTINATION bin)
install (FILES “${PROJECT_BINARY_DIR}/TutorialConfig.h”
DESTINATION include)

(4).Cmake生成Cpp文件

  • 1.我们进入 four/a 目录中,这里的代码都是从 two/a 中拷贝过来的,所以我就只贴修改的部分,mylib/CMakeLists.txt、mylib/MakeTable.cpp、a/Configure.h.in:
  • 1.这里的目的主要是通过 MakeTable 这个 project 生成一个 Table.h。最后给 mysqrt.cpp 在当前系统中没有 log 和 exp 这两个函数的时候使用。
  • 2.我们运行了 cmake… 之后会发现 build/mylib 目录中生成了 Table.h 这个文件

project(MakeTable)

add_executable(MakeTable MakeTable.cpp)

1.输出 Table 文件

2.将 Table 文件作为参数传入 MakeTable 项目中,并运行它

3.Table 的生成是依赖于 MakeTable 这个 project 的

CMAKE_CURRENT_BINARY_DIR 表示某个 cmake 文件build之后的文件夹,比如这里就是指 build/mylib

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable)

include_directories(${CMAKE_CURRENT_BINARY_DIR})

将生成的表一起编译到 MathFunctions_Table 中去

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

Android学习PDF+架构视频+面试文档+源码笔记

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

aster/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

[外链图片转存中…(img-v00iXrDJ-1643966678503)]

【算法合集】

[外链图片转存中…(img-8RFPvP1x-1643966678504)]

【延伸Android必备知识点】

[外链图片转存中…(img-Q27WwYcG-1643966678505)]

【Android部分高级架构视频学习资源】

从零开始仿写一个抖音App——音视频开篇,移动安全入门相关推荐

  1. android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

    本文首发于微信公众号--世界上有意思的事,搬运转载请注明出处,否则将追究版权责任.交流qq群:859640274. 大家好久不见,又有一个多月没有发文章了.不知道还有哪些读者记得我的 从零开始仿写抖音 ...

  2. 从零开始仿写一个抖音App——基于FFmpeg的极简视频播放器

    本文首发于微信公众号--世界上有意思的事,搬运转载请注明出处,否则将追究版权责任.微信号:a1018998632,交流qq群:859640274 1.从零开始仿写一个抖音app--开始 4.从零开始仿 ...

  3. 从零开始仿写一个抖音App

    点击上方"何俊林",马上关注,每天早上8:50准时推送 真爱,请置顶或星标 本文转载自公号开发者技术前线,原文:https://juejin.im/post/5b9e9bf1e51 ...

  4. android 直播sdk 抖音,从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

    不知不觉已经到了2019年,本系列的文章也更新到了8篇.很庆幸笔者能坚持下来,从我司的代码中学习到了很多东西.当然更庆幸的是收获了众多读者的鼓励和支持.从本篇文章开始,我们将接触短视频 app 中比较 ...

  5. 从零开始仿写一个BiliBili客户端之编译ijkplayer

    章节 从零开始仿写一个B站客户端之-编译ijkplayer 从零开始仿写一个B站客户端之-抓包B站接口 从零开始仿写一个B站客户端之-使用ijkplayer打造一个通用的播放器 从零开始仿写一个B站客 ...

  6. QT开发--仿写一个智能家居APP

    一.给工程添加图片 二.引用添加的图片 在界面设置界面点击按钮或者文本控件,右键改变样式表,然后再添加资源选择border-image,然后就可以找到图片进行编译控制. 三.qt布局 水平布局,垂直布 ...

  7. 从零开始写一个抖音App——Apt代码生成技术、gradle插件开发与protocol协议

    1.讨论--总结前两周评论中有意义的讨论并给予我的解答 2.mvps代码生成原理--将上周的 mvps 架构的代码生成原理进行解析 3.开发一款gradle插件--从 mvps 的代码引出 gradl ...

  8. 仿抖音APP短视频源码PHP安卓IOS

    随着短视频市场的不断发展,越来越多的人开始关注短视频APP的开发和推广. 仿抖音APP短视频源码主要介绍: 系统语言:APP是原生安卓和IOS, 后端和接口是PHP(tp框架).数据库mysql+re ...

  9. Flutter入门实战教程:从0到1仿写web版掘金App (完结)

    前言 准确的说,这是去年十一月份就写好的教程, 虽然迟迟未上线(拖了半年),但是非常感谢购买的老铁们~ 虽然心中很不爽, 但是回头想想,也是的确写的比较仓促,但是当时自己在写的过程中,的确能学到很多东 ...

最新文章

  1. Swift3.0语言教程使用字符串创建和初始化字符串
  2. Linux学习建议 学习测试环境标准化配置
  3. python strftime格式化显示_Python 格式化输出时间字符串函数 strftime
  4. CodeForces - 1343F Restore the Permutation by Sorted Segments(思维)
  5. HBase数据迁移到Kafka实战
  6. JavaSE | 多线程
  7. 因为银行原因出现房贷逾期,怎么修复征信?
  8. openssl 对文本加密解密
  9. 20171201-构建之法:现代软件工程-阅读笔记
  10. IOS6 编程:Core Data持久化数据存储(5)-使用Core Data模板创建EntLibCart项目
  11. mysql 查询优化 ~ 分区表查询的探索
  12. leetcode刷题日记-喧闹和富有
  13. Atitit 开发2d游戏的技术选型attilax总结
  14. html影院选座模板,jQuery实现影院选座订座效果
  15. vue2.0 仿蘑菇街
  16. 【蜂口 | AI人工智能】三维人脸重建——龙鹏 深度学习与人脸图像应用连载(十)...
  17. excel操作技巧:“自定义名称”应用基础篇
  18. 面经:阿里二面自我剖析---Java岗(50分钟)
  19. 后台管理系统 权限管理
  20. centos怎么用命令关机_CentOS关机命令

热门文章

  1. 电子元器件失效模式及失效机理汇总
  2. 大数据华而不实么?大数据的本质是什么?
  3. vue 封装饿了么文件上传组件实现图片上传
  4. 【行业云说直播间】-云数底座赋能基层治理现代化正式上线
  5. 给时光以生命,而不是给生命以时光--2018年终总结
  6. 小学信息技术 用计算机画画 教学目标,三年级下册信息技术教学计划4篇
  7. 计算机视觉中头部姿态估计的研究综述--Head Pose Estimation in Computer Vision - A Survey
  8. 3d Max安装失败(Microsoft Visual C++ 2010 Redistributable)
  9. 时光机特效什么app好?建议收藏这些软件
  10. 记一次在咸鱼上购买 MacBook Pro 的经历