CMake Practice 学习笔记二---子目录、安装

news/2025/2/6 2:57:42/

让前面的Hello World更像一个工程:

  1. 为工程添加一个子目录src,用来放置工程源代码;
  2. 添加一个子目录doc,用来反之这个工程的文档hello.txt;
  3. 在工程目录添加文本文件COPYRIGHT,README;
  4. 在工程目录添加一个runhello.sh脚本,用来调用hello二进制;
  5. 将构建后的目标文件放入构建目录的bin子目录;
  6. 最终安装这些文件:将hello二进制与runhello.sh安装至/usr/bin,将doc目录的内容以及COPYRIGHT、README安装到/usr/share/doc/cmake/t2

1、准备工作

在/backup/cmake 目录下建立t2目录:

mkdir t2
mv t1/main.c t1/CMakeLists.txt t2/
touch COPYRIGHT
touch README

添加子目录src:

cd t2 
mkdir src
mv main.c srcmkdir doc
vi doc/hello.txt # 随便写点东西进去并保存

进入子目录src,建立一个CMakeLists.txt,其内容如下:

ADD_EXECUTABLE(hello main.c)# 换个地方保存目标二进制文件
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

t2工程的CMakeLists.txt修改为:

PROJECT(HELLO)# 向当前工程添加源文件的子目录 src
# 并指定中间二进制文件和目标二进制文件存放的位置 编译目录下的bin目录 ( 可以不指定,则为编译目录下的src目录)
ADD_SUBDIRECTORY(src bin)# 安装COPYRIGHT、README文件
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)# 安装 runhello.sh
INSTALL(PROGRAMS runhello.sh DESTINATION bin)# 安装doc目录中的内容,即hello.txt
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2) # 一定是doc/# 安装可执行二进制、动态库、静态库
#INSTALL(TARGETS myrun mylib mystaticlibRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION libstatic)
# 安装可执行二进制
INSTALL(TARGETS hello  RUNTIME DESTINATION bin)

2、构建

在t2目录下新建build目录,进入build目录进行外部编译

此时-DCMAKE_INSTALL_PREFIX指定的目录就是上面INSTALL指令中的DESTINATION

cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
make
sudo make install

安装结果:

如果你要直接安装到系统:

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

问:如果没有定义CMAKE_INSTALL_PREFIX会安装到哪里?

CMAKE_INSTALL_PREFIX的默认定义是/usr/local哦。

问:你也许会疑惑,src目录下的CMakeLists.txt好像没有用到过?

在工程目录t2下的CMakeLists.txt中的一句ADD_SUBDIRECTORY(src bin),就会进入子目录src利用该目录下CMakeLlists.txt进行构建哦。

 


http://www.ppmy.cn/news/82767.html

相关文章

探究ChatGPT与GPT-4的缺陷不足,揭示大预言LLM模型的局限性——没有完美的工具

目录 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的1. 引言2. 事实性错误2.1 问题示例2.2 原因分析2.3 解决方法 3. 实时更新3.1 问题示例3.2 原因分析3.3 解决方法 4. 总结 参考资料其它资料下载 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的 1. 引言 2022 年末 C…

通过nginx解决vue项目打包后跨域代理失效问题

这里 我的接口是写在 http://localhost:80上的 接口名是user 需要一个id路径参数 我们知道 80是默认 所以就可以不带端口因此访问就是http://localhost/user/1 然后 我vue项目中的 vue.config.js 配置如下 const { defineConfig } require(vue/cli-service) module.exports …

第14章_视图

第14章_视图 1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录数据字典就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不…

基于SOPC的音乐播放系统设计

1 目的 1. 让自己能真正用SOPC做出一个实际的定西,学习基于SOPC的嵌入式软件开发的基本流程; 2. 了解一些比较实用的定西,比如SD卡,VS1003,TFT等,并且能做到同时操作,而不…

算法修炼之练气篇——练气一层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

多表联查及mybatis中@Results,@ResultMap注解的应用

在实际的项目中,为了保证数据的简洁和查询的效率,通常会到采用多表联查。 那么什么是多表联查呢? 一般查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中&#xff0…

汽车电子电气架构里的VCU DCU ZCU ECU怎么区分?

文章目录 一、VCU二、DCU三、ECU四、ZCU五、车辆电子电气架构的域架构 一、VCU VCU(Vehicle Control Unit,车辆控制单元):VCU是车辆级别的控制单元,负责管理和协调车辆的各个系统和子系统之间的通信和协同工作。它可以…

Spring MVC——Rest风格

REST(Representational State Transfer) 当我们想表示一个网络资源的时候,可以使用两种方式: 我们分别用查询id为1的用户信息与保存用户信息举例传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user/saveUser RES…