技术干货---CMake编译配置工具,让编译设计工作更快更高效!(2)

|—project
|----------app_module #这个工程是app的主工程,里面有一个商贩类,并且有个main程序入口。
|----------second_module #这个工程是二方module,将以源码的方式被app_module依赖,里面有个表示外国友人的foreign类。
|----------third_party #这个是工程依赖的第三方库,示例中的汇率转换工具,将由银行提供,作为第三方库被集成,非源码依赖。

示例讲解
  1. 帮助银行生成一个汇率库,我们给这个库起个名字叫rate_util,发出去给商贩们使用。

#声明所需cmake的最小版本号
cmake_minimum_required(VERSION 3.11)

#指定生成的target(一个银行工具库,可以用来做汇率转换)
add_library(rate_util SHARED rate_util.cpp)

#指定library输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY P R O J E C T S O U R C E D I R / b u i l d / l i b s / {PROJECT_SOURCE_DIR}/build/libs/ PROJECTSOURCEDIR/build/libs/{OS})
#安装头文件到指定的目录
install(FILES “rate_util.h” DESTINATION “${PROJECT_SOURCE_DIR}/build/inc”)

#如果是iOS平台,则生成framework
if(“${OS}” STREQUAL “iOS”)
set_target_properties(rate_util PROPERTIES FRAMEWORK TRUE)
endif()

前面我们讲到过,cmake需要指定Target,那这里的target就是要生成的工具库,这里我们编译一个动态库,用add_library来指定target是一个库,用SHARED标记这个是一个动态库,然后指定要编译的源文件,这里只有一个就是rate_util.cpp。如果要生成可执行文件就是add_executable,后面生成main程序的时候会看到。

接下来还要指明这个库输出到哪里,这里我们使用cmake内置的一个变量CMAKE_LIBRARY_OUTPUT_DIRECTORY,实际上从变量名大家也能看出来,这个表示生成library的输出目录,cmake还有很多其他的内置变量,实际上上面代码的PROJECT_SOURCE_DIR也是一个内置变量,关于cmake变量我们将在后面讲解。

然后我们又指定了这个库的头文件安装位置,因为这个库要被其他人拿去使用,所以相应的头文件肯定也要跟着发不出去,这里我们使用了一个install命令,这是cmake的内置命令,就像add_library一样都是cmake的内置命令,关于cmake命令我们后面会讲解。

实际上到这里一个基础的cmake配置就完成了,后面我们还加了点小菜,就是给这个target设置了一个属性,标记如果是iOS平台编译的话,要生成framework,而不是dylib这种动态库。至此,第一个问题就有了答案。(示例下载:bank.zip

  1. **银行的第三方库有了,接下来就要搭建我们的app工程了,我们就按照上面提到的工程结构来。 **

在开始搭建前先来点小甜点,开篇提到过cmake编译时需要依赖一个CMakeLists.txt配置文件,如果我们像第一步那样所有的配置,所有module的配置都写到一个CMakeLists.txt里面,是不是要疯掉。幸好cmake有个超级好用的内置命令叫add_subdirectory,顾名思义,就是可以用它来指定子目录,当然也就意味着子目录里必须也有一个CMakeLists.txt,这样我们就可以分级去写配置了,各个module的配置写在各自的CMakeLists.txt 里就好了。按照这个思路,我们的工程结构应该变成这样

|—project
|----------CMakeLists.txt#工程最外面入口的CMakeLists.txt
|----------app_module #这个工程是app的主工程,里面有一个商贩类,并且有个main程序入口。
|---------CMakeLists.txt #app_module这个子module的CMakeLists.txt
|----------second_module #这个工程是二方module,将以源码的方式被app_module依赖,里面有个表示外国友人的foreign类。
|----------CMakeLists.txt #second_module这个子module的CMakeLists.txt
|----------third_party #这个是工程依赖的第三方库,示例中的汇率转换工具,将由银行提供,作为第三方库被集成,非源码依赖。
|----------CMakeLists.txt#第三方库的总配置CMakeLists.txt
|----------bank
|---------CMakeLists.txt#银行这个第三方库的CMakeLists.txt

实际上这个结构就是我们demo工程的结构,接下来我们逐个CMakeLists.txt分析。首先看project->CMakeLists.txt,也就是工程总入口的配置:

CMake最低版本号要求

cmake_minimum_required (VERSION 3.11)

#项目信息
project§
#添加一堆的子module
add_subdirectory(app_module ${PROJECT_SOURCE_DIR}/build-cache/app_module/)
add_subdirectory(second_module ${PROJECT_SOURCE_DIR}/build-cache/second_module/)
add_subdirectory(third_party ${PROJECT_SOURCE_DIR}/build-cache/third_party/)

配置很简单,声明了cmake最低版本号,指定了项目信息,然后就是添加了一堆子module,实际上啥活也没干,事情都分配给下面的小弟了,然后我们再看小弟们的CMakeLists.txt先看app_module->CMakeLists.txt,

#声明cmake最低版本号
cmake_minimum_required (VERSION 3.11)

#声明要编译的target是一个可执行文件,target名字是main
add_executable(main
saler.cpp
)

#指定main要链接的其他target,实际上也就是这些target对应的库
target_link_libraries(main
foreign
rate_util
)

#指定这个target的include路径,编译器将在这些路径中寻找头文件
target_include_directories(main
PUBLIC
${PROJECT_SOURCE_DIR}/third_party
)

#设置可执行文件的输出路径
set(EXECUTABLE_OUTPUT_PATH P R O J E C T S O U R C E D I R / b u i l d / b i n / {PROJECT_SOURCE_DIR}/build/bin/ PROJECTSOURCEDIR/build/bin/{OS})

这个里面就有货了,首先映入眼帘的就是add_executable,原来最终的可执行文件就是在这里生成的,定义了一个叫main的target,由于这个app主程序还要依赖外国友人和银行汇率工具库这两个库,所以我们要给它去指定link的库,这里用到cmake另一个内置命令target_link_libraries,但是参数里指定的都是target name,而并不是库名。只link了库还不够,还要指定头文件查找路径,否则第三方库的头文件找不到,用cmake内置命令target_include_directories,最后需要设置可执行文件的输出目录,这里类似步骤1中生成银行库一样,也是设置cmake内置变量的值,用到的内置变量是*EXECUTABLE_OUTPUT_PATH,*后面的${OS}是我们自定义的一个变量,去看完整的示例工程时会看到。接下来我们再看second_module->CMakeLists.txt,也就是外国友人所在的module,这个module并不是独立的第三方库,而是源码依赖的。

#声明cmake最小版本号
cmake_minimum_required (VERSION 3.11)
#指定target,一个名字为foreign的target,生成物是一个静态库
add_library(foreign
STATIC
ForeignFriend.cpp
)
#指定该target的头文件查找路径,PUBLIC表示该路径也会被传递给依赖该target的库,在该工程中app_module依赖了foreign,因此app_module也能访问该路径,这也就是
#为什么app_module中的文件在引用foreign库中的头文件时不用加前面的路径,直接使用文件名即可
target_include_directories(foreign
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)

可以看到foreign被作为另一个target声明了,指定生成一个名字为foreign的静态库,并且同样指明了头文件包含路径,由于这里是源码依赖的,该头文件不需要发布给外外面,因此不需要install。最后我们看下第三方库——银行汇率转换工具库是怎么被使用的。

#声明cmake最小版本号
cmake_minimum_required(VERSION 3.11)
#添加一个imported library,
add_library(rate_util SHARED IMPORTED
GLOBAL)
#设置library的位置
set(__lib_name lib_rateutil.so)
if(“KaTeX parse error: Expected group after '_' at position 31: …"android") set(_̲_lib_name libra…{OS}” STREQUAL “iOS”)
set(__lib_name rate_util.framework)
else()
set(__lib_name librate_util.dylib)
endif()
#设置target属性,指明该target imported的库的路径
set_target_properties(rate_util PROPERTIES IMPORTED_LOCATION P R O J E C T S O U R C E D I R / t h i r d p a r t y / b a n k / l i b s / {PROJECT_SOURCE_DIR}/third_party/bank/libs/ PROJECTSOURCEDIR/thirdparty/bank/libs/{OS}/${__lib_name})
#由于这里target是imported进来的,不能使用target_include_directories,因此要用include_directories
include_directories(rate_util
PUBLIC
${CMAKE_CURRENT_LIST_DIR}/inc)

这里第三方库也被声明为一个单独的target了,但是与之前不同的是这里并没有给target指定源文件(因为本来也没有源文件,这是外部编译好的可以直接拿来使用的动态库),而是通过一个IMPORTED标记,表示这个target是外部引入的库,然后通过给target设置IMPORTED_LOCATION这一属性值,指明导入库的文件路径。另外有一点不同的是这里声明头文件包含路径时不能使用target_include_directories了,而要使用include_directries,cmake不允许为imported的库使用target_include_directries。至此,开始提出的2,3问题也都有了答案。

3.  如何生成不同平台的库
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司21年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cmake-gui是一个图形界面工具,用于帮助配置交叉编译环境。交叉编译是将源代码从一种平台编译成在另一种平台上运行的可执行程序的过程。以下是使用cmake-gui来配置交叉编译环境的步骤: 1. 打开cmake-gui工具。 2. 在"Where is the source code"字段中输入源代码的路径。 3. 在"Where to build the binaries"字段中输入生成的可执行文件的路径。 4. 在"Generator"字段中选择要使用的交叉编译器。 5. 在"Specify toolchain file"字段中选择交叉编译工具链文件。 6. 单击"Configure"按钮,cmake-gui将自动检测交叉编译器和工具链文件,并在窗口中显示相关的设置选项。 7. 根据实际情况修改和配置生成选项,例如选择要构建的目标平台、设置编译器选项等。 8. 单击"Generate"按钮,cmake-gui将生成Makefile或其他构建系统所需的配置文件。 9. 在终端中进入生成的可执行文件路径,并执行构建命令(例如make),即可开始交叉编译。 10. 等待编译过程完成,生成的可执行程序将位于指定的二进制路径中。 使用cmake-gui进行交叉编译配置可以简化配置过程,提供了直观的图形界面操作,同时也可以让开发人员灵活地根据需求进行各种配置选项的设置,方便进行跨平台开发和调试。 ### 回答2: cmake-gui是一个基于图形界面的CMake配置工具,用于帮助开发者进行跨平台和交叉编译配置。 交叉编译是指在一个主机上构建、编译和运行适用于另一个主机系统的程序。在进行交叉编译配置之前,首先需要确定目标主机的架构、操作系统和编译器等信息。 使用cmake-gui进行交叉编译配置的步骤如下: 1. 打开cmake-gui工具。 2. 在"Where is the source code"一栏中,输入项目的源代码路径。 3. 在"Where to build the binaries"一栏中,输入项目的构建路径。这里可以选择在当前工作空间内或者指定一个新的目录。 4. 点击"Configure"按钮,选择对应的生成器。在弹出的对话框中,根据目标主机的操作系统类型选择对应的生成器。例如,如果目标主机是使用GNU make系统,则选择"Unix Makefiles"生成器。 5. 在"Optional platform for generator"一栏中,填写目标主机所属的平台。例如,如果目标主机是使用armv7架构,则填写"armv7"。 6. 在"Optional toolset to use"一栏中,填写用于构建目标程序的工具集。这里可以选择在配置时指定编译器和工具链。 7. 点击"Finish"按钮,开始进行交叉编译配置过程。 8. 在配置过程中,cmake-gui会根据所选择的生成器和目标主机的相关信息,分析项目的CMakeLists.txt文件,并生成相应的配置文件。如果配置过程中缺少依赖库或编译工具等,可以在cmake-gui的界面上进行相关设置。 9. 配置完成后,点击"Generate"按钮,即可生成对应的项目构建文件。 通过以上步骤,我们可以使用cmake-gui工具进行交叉编译配置,从而在不同的主机上构建和运行适用于目标主机系统的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值