当前位置: 首页 > article >正文

linux-CMake

linux-CMake

  • 1.安装CMake工具
  • 2.单个源文件
  • 3.多个源文件
  • 4.生成库文件
  • 5.将源文件组织到不同的目录下
  • 6.可执行文件和库文件放置到单独的目录下
  • 7.常见的命令

CMake使用。

1.安装CMake工具

sudo apt-get install cmake

在这里插入图片描述

2.单个源文件

1.先在文件夹里创建两个文件:main.c,CMakeLists.txt。

在这里插入图片描述
2.在main.c文件里加入一段程序。

#include <stdio.h>

int main()
{
	 printf("Hello World!\n");
	 return 0;
}

3.在CMakeLists.txt文件里加入命令。

project(hello)
add_executable(hello ./main.c)

这两句的意思是:project(工程名称)设置工程的名称
add_executable(可执行文字名称,源代码) 设置生成的可执行文件的名字和要连接的源文件。
4.执行cmke命令
在这里插入图片描述
5.执行make命令
在这里插入图片描述
此时可以看到一个可执行文件hello生成
6.执行一下看是否和源文件一样
在这里插入图片描述
结果输出一样。
7.使用 out-of-source 方式构建
这时会发现目录比较杂乱,当我们需要清理 cmake 产生的文件时将变得非常麻烦。此时可以将构建过程生成的文件与源文件分离开来。
将cmake编译生成的文件全部清零下,只保留最开始的两个文件。然后在工程目录下创建一个build的目录,
在这里插入图片描述
这样 cmake 生成的中间文件以及 make 编译生成的可执行文件就全部在 build 目录下了,如果要清理工程,直接删除 build 目录即可,这样就方便多了。

3.多个源文件

1.创建三个文件hello.h hello.c main.c我们在main.c里调用hello.c里的函数

在这里插入图片描述
2.在这三个文件里填写以下函数

//hello.h
#ifndef __TEST_HELLO_
#define __TEST_HELLO_
void hello(const char *name);
#endif //__TEST_HELLO_

//hellow.c
#include <stdio.h>
#include "hello.h"

void hello(const char *name)
{
 printf("Hello %s!\n", name);
}

//main.c
#include "hello.h"
int main(void)
{
 hello("World");
 return 0;
}

3.填写CMakeLists.txt

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

第一句同样是 设置工程名称。
第二句 设置了一个SRC_LIST 的变量,该变量是一个源文件列表,记录了生成可执行文件hello需要的源文件main.c hello.c。
第三句 设置可执行文件的名称和所用的源文件。
同样也可以直接写在add_executable里

add_executable(hello main.c hello.c)

在这里插入图片描述

4.生成库文件

除了生成可执行文件 hello 之外,我们还需要将 hello.c 编译为静态库文件或者动态库文件。在上一个的基础上对 CMakeLists.txt 文件进行修改,如下所示:

project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)

新加了两条新的语句:add_library(libhello hello.c) 意思是把hello.c文件编译为静态库。第一个参数为库文件的名字(不用加前缀和后缀),第二个位所有的源文件。静态库的前缀是lib,后缀为.a。动态库的后缀是.so。(add_library(libhello SHARED hello.c) 链接为动态库)
target_link_libraries(hello libhello) 意思是目标指定依赖库。将其链接进hello程序。

在这里插入图片描述
生成了liblibhello.a静态库,你会发现这个名字和我们填的libhello不一样还十分的不好看。造成这个情况的原因是,add_library()会自动的添加静态库的前缀lib。那如果将我们填写的libhello改成hello是不是就可以了。实际是不可以的因为hello我们在下面生成可执行文件使用的也是这个名称,两者不能一样。那该怎么更改名字,可以使用下面这个命令来。

set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello  hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
add_executable(hello main.c)
target_link_libraries(hello libhello)

除了添加 set_target_properties 命令之外,我们还加入了 cmake_minimum_required 命令,该命令用于设置当前工程的 cmake 最低版本号要求,当然这个并不是强制性的,但是最好还是加上。
在这里插入图片描述
这时生成的静态库就是我们想要的libhello.a了。

5.将源文件组织到不同的目录下

1.先将工程整理一下。
在这里插入图片描述
2.编写最外面的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_subdirectory(libhello)
add_subdirectory(src)

add_subdirectory()用来告诉cmke去子目录libhello,src中寻找新的CMakeLists.txt文件来解析它;
3.编写src 目录下的 CMakeLists.tx文件

include_directories(${PROJECT_SOURCE_DIR}/libhello)
add_executable(hello main.c)
target_link_libraries(hello libhello)

include_directories()用来指明头文件所在的路径,并且使用到了 PROJECT_SOURCE_DIR 变量,该变量指向了一个路径,从命名上可知,该变量表示工程源码的目录。
4.编写libhello目录下的CMakeLists.txt文件

add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

5.最后到build文件里构建,编译,最终会得到可执行文件 hello(build/src/hello)和库文件 libhello.a(build/libhello/libhello.a)

6.可执行文件和库文件放置到单独的目录下

1.将 src 目录下的 CMakeList.txt 文件进行修改

include_directories(${PROJECT_SOURCE_DIR}/libhello)

add_executable(hello main.c)
target_link_libraries(hello libhello)

EXECUTABLE_OUTPUT_PATH 变量控制可执行文件的输出路径
2.然后再对 libhello 目录下的 CMakeList.txt 文件进行修改

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

LIBRARY_OUTPUT_PATH 变量控制库文件的输出路径

7.常见的命令

command说明
add_executable可执行程序目标
add_library库文件目标
add_subdirectory去指定目录中寻找新的 CMakeLists.txt 文件
aux_source_directory收集目录中的文件名并赋值给变量
cmake_minimum_required设置 cmake 的最低版本号要求
get_target_property获取目标的属性
include_directories设置所有目标需要链接的库
list列表相关的操作件
message用于打印、输出信息
project设置工程名字
set设置变量
set_target_properties设置目标属性
target_include_directories设置指定目标头文件的搜索路径
target_link_libraries设置指定目标库文件的搜索路径
target_sources设置指定目标所需的源文件

http://www.kler.cn/news/331427.html

相关文章:

  • 【Java】酒店管理系统
  • ComfyUI基本使用方法和常用插件
  • CentOS进行ICMP洪水测试并TShark抓包:完整指南
  • Java多线程在单体、微服务、服务网格与云原生架构中的理解与线程安全保障:总结与对比
  • 深入掌握 Qt 中的数据库操作:从基础到高级技巧
  • 【大数据】Doris 数据库与表操作语法实战详解
  • 【Unity踩坑】Unity更新Google Play结算库
  • 力扣 简单 111.二叉树的最小深度
  • 手机使用指南:如何在没有备份的情况下从 Android 设备恢复已删除的联系人
  • Linux 应用层协议HTTP
  • 初始Kafka
  • 贪心算法专题(一)
  • vue文件的认识
  • 【微服务】初识(day1)
  • Qt day01
  • PyQt入门指南三 创建第一个PyQt应用程序
  • 华为资源分享
  • android Activity生命周期
  • 简单分享下Python和MySQL管理和执行测试用例
  • SPARK调优:AQE特性(含脑图总结)