linux-CMake

linux-CMake

CMake使用。

1.安装CMake工具

c 复制代码
sudo apt-get install cmake

2.单个源文件

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

2.在main.c文件里加入一段程序。

c 复制代码
#include <stdio.h>

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

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

c 复制代码
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.在这三个文件里填写以下函数

c 复制代码
//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

c 复制代码
project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

第一句同样是 设置工程名称。

第二句 设置了一个SRC_LIST 的变量,该变量是一个源文件列表,记录了生成可执行文件hello需要的源文件main.c hello.c。

第三句 设置可执行文件的名称和所用的源文件。

同样也可以直接写在add_executable里

c 复制代码
add_executable(hello main.c hello.c)

4.生成库文件

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

c 复制代码
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我们在下面生成可执行文件使用的也是这个名称,两者不能一样。那该怎么更改名字,可以使用下面这个命令来。

c 复制代码
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
c 复制代码
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文件

c 复制代码
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文件

c 复制代码
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文件

c 复制代码
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 文件进行修改

c 复制代码
include_directories(${PROJECT_SOURCE_DIR}/libhello)

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

EXECUTABLE_OUTPUT_PATH 变量控制可执行文件的输出路径

2.然后再对 libhello 目录下的 CMakeList.txt 文件进行修改

c 复制代码
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 设置指定目标所需的源文件
相关推荐
wdxylb6 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20077 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪7 小时前
关于Linux内核中头文件问题相关总结
linux
海绵不是宝宝8178 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
Lovyk9 小时前
Linux 正则表达式
linux·运维
Fireworkitte10 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil90011 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char11 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
繁星¹⁸⁹⁵12 小时前
通过update-alternatives可以实现cuda的多版本切换
服务器
淮北也生橘1213 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习