cmake的使用方法: 将源文件组织到不同的目录

2024-05-04 02:44

本文主要是介绍cmake的使用方法: 将源文件组织到不同的目录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.  简介

前面几篇文章学习了cmake工具针对单个 .c文件的编译方法。

cmake针对含有多个 .c文件的工程的使用编译。cmake工程编译是如何实现编译生成库文件。

本文学习一下另一种情况:当源文件组织到不同的目录下时,cmake工具该如何编译工程。

二.  cmake的使用方法:  将源文件组织到不同的目录

1.  工程目录

前面的多个.c文件的工程中,我们已经加入了多个源文件,但是这些源文件都是放在同一个目录下,这样还是不太正规。

我们应该将这些源文件按照类型、功能、模块给它们放置到不同的目录下,于是笔者将工程源码进行了整理。于是我这里将工程源码进行了整理,当前目录结构如下所示:

在工程目录下,我们创建了 src 和 libhello 目录,并将 hello.c 和 hello.h 文件移动到 libhello 目录下,将 main.c 文件移动到 src 目录下,并且在顶层目录、libhello 目录以及 src 目录下都有一个 CMakeLists.txt 文件。
CMakeLists.txt 文件的数量从 1 个一下变成了 3 个,顿时感觉到有点触不及防!还好每一个都不复杂!
我们来看看每一个 CMakeLists.txt 文件的内容。

(1) 顶层CMakeLists.txt 文件

顶层CMakeLists.txt 文件内容如下:

cmake_minimum_required(VERSION 3.16.3) #cmake版本号
project(HELLO)             #设置工程名
add_subdirectory(libhello) #告诉cmake,去子目录查找新的CMakeLists.txt并解析
add_subdirectory(src)      #告诉cmake,去子目录查找新的CMakeLists.txt并解析

(2) src 目录下的 CMakeLists.txt

src 目录下的 CMakeLists.txt 文件内容如下:
include_directories(${PROJECT_SOURCE_DIR}/libhello)  #设置头文件路径
add_executable(hello main.c) #生成目标文件名
target_link_libraries(hello libhello) #设置所链接的库文件

(3)  libhello 目录下的 CMakeLists.txt

libhello 目录下的 CMakeLists.txt文件内容如下:

add_library(libhello hello.c) #设置生成的库文件名+所需的源文件
#重新设置库文件名
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello") 

三个 CMakeLists.txt文件分析:

顶层 CMakeLists.txt 中使用了 add_subdirectory 命令,该命令告诉 cmake 去子目录中寻找新的
CMakeLists.txt 文件并解析它;
而在 src 的 CMakeList.txt 文件中,新增加了 include_directories 命令用来指明头文件所在的路径,并且使用到了 PROJECT_SOURCE_DIR 变量,该变量指向了一个路径,从命名上可知, 该变量表示工程源码的目录。

三.   cmake 编译工程

和前面一样,进入到 build 目录下进行构建、编译,即进入工程根目录下输入如下命令:
cd build/
cmake ../
make
工程目录为:
├── build
│ ├── libhello
│ │ └── libhello.a
│ └── src
│ └── hello
├── CMakeLists.txt
├── libhello
│ ├── CMakeLists.txt
│ ├── hello.c
│ └── hello.h
└── src├── CMakeLists.txt└── main.c

最终会在 build文件目录下生成可执行文件 hello(build/src/hello)和库文件 libhello.a(build/libhello/libhello.a)。

hello可执行文件所在目录: /build/src/

libhello.o库文件所在目录:/build/libhello/

运行 hello可执行程序:

可以看出,可执行程序正常运行。

这篇关于cmake的使用方法: 将源文件组织到不同的目录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958185

相关文章

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.