当前位置:网站首页 > C++编程 > 正文

cmake多目录编译(cmake添加多个目录下源文件)



Linux | 红帽认证 | IT技术 | 运维工程师

👇1000人技术交流 备注【公众号】更快通过

一、cmake安装

1、在官网下载cmake的安装包,这里我下载的是v3.26

wget https://github.com/Kitware/CMake/releases/download/v3.26.0-rc4/cmake-3.26.0-rc4-linux-x86_64.sh

2、找到下载的sh文件,并使用bash来执行sh脚本

bash cmake-3.26.0-rc4-linux-x86_64.sh

3、然后把cmake/bin/cmake软链接到/bin目录下

ln -s /root/download/cmake-3.26.0-rc4-linux-x86_64/bin/cmake /bin/cmake

4、此时已经安装完成,可以在shell中使用cmake命令

二、使用cmake来配合程序的编译

1、只有一个源文件的程序编译

首先在当前目录下创建两个文件

hello.cpp

#include <iostream>using namespace std;int main(){cout << "Hello 今天是2023/2/26" << endl;return 0;}

CMakeLists.txt (注意CMakeLists大小写,不要写错了)

cmake_minimum_required (VERSION 2.8)project (learn_cmake)add_executable(hello hello.cpp)
第一行意思是cmake最低版本要求2.8,第二行是本项目的工程名第三行:第一个变量:要生成的可执行文件名为hello,后面的参数是需要的依赖。

接着在当前目录下执行 cmake .

[root@centOS learn_cmake]# cmake .CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required): Compatibility with CMake < 2.8.12 will be removed from a future version of CMake.Update the VERSION argument <min> value or use a ...<max> suffix to tell CMake that the project does not need compatibility with older versions.-- The C compiler identification is GNU 8.3.1-- The CXX compiler identification is GNU 8.3.1-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Check for working C compiler: /opt/rh/devtoolset-8/root/usr/bin/cc - skipped-- Detecting C compile features-- Detecting C compile features - done-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Check for working CXX compiler: /opt/rh/devtoolset-8/root/usr/bin/c++ - skipped-- Detecting CXX compile features-- Detecting CXX compile features - done-- Configuring done (1.0s)-- Generating done (0.0s)-- Build files have been written to: /root/learn_cmake

接着会发现目录下多生成了一些文件,例如Makefile

然后使用GNU make来编译程序

此时会发现已生成可执行程序,并可以正常执行

2、同一目录下多个源文件

此时在当前目录新增两个依赖,并mian函数的执行需要依赖这两个文件

add.cppadd.h

只需要在CMakeLists.txt中添加所依赖的.cpp文件,编译步骤和上面相同

三、同一目录下很多源文件

如果同一目录下有无穷多源文件,那么一个一个添加就很慢了。此时可以使用cmake中的函数存储这些源文件

aux_source_directory(dir var)

他的作用是把dir目录中的所有源文件都储存在var变量中

然后需要用到源文件的地方用 变量var来取代

此时 CMakeLists.txt 可以这样优化

注意:变量的使用和Makefile不同,CMake是利用大括号,如 ${index}

四、头文件在别的文件夹

对于集中的头文件,CMake提供了一个很方便的函数

include_directories ( dir )

他的作用是 自动去dir目录下寻找头文件,相当于 gcc中的 gcc -I dir

此时 CMakeLists.txt 可以这样优化

五、头文件源文件分离,并含有多个文件夹

假如说当前的工程目录是这样的,头文件和源文件分离,并含有多个文件夹

根据上面的《三》和《四》。此时 CMakeLists.txt 可以这样优化

六、生成动态库和静态库

假如说当前的项目目录是这样的

inc目录下存放头文件

src目录下存放源文件

lib目录下存放生成的库

build目录下存放构建项目相关的文件,如CMakeLists.txt。而稍后我们也在这个目录下执行cmake和make

此时 CMakeLists.txt 可以这样优化

解释一下:

PROJECT_BINARY_DIR是cmake系统变量,意思是执行cmake命令的目录,我们计划在build目录下执行cmake命令,所以这个变量也就等同于build目录

add_library(lib_name STATIC/SHARED src) # 函数作用:生成库。# 参数lib_name:是要生成的库名称,# 参数STATIC/SHARED:指定生成静态库或动态库,# 参数src:指明库的生成所需要的源文件
set_target_properties重新定义了库的输出名称,如果不使用set_target_properties也可以,那么库的名称就是add_library里定义的名称。具体可以参考官方文档。
LIBRARY_OUTPUT_PATH 是cmake系统变量,项目生成的库文件都放在这个目录下。这里我指定库生成到lib目录。

开始编译:

在build目录下执行 cmake .

在build目录下执行 make

查看lib目录下是否生成库文件,

出现库文件就算编译成功

七、链接库文件

我们已经在lib目录下生成了库文件,下面我们写一个main函数来使用库文件

目录结构如下:

lib目录下存放静态库和动态库

main_src目录下存放main函数相关的源文件

bin目录存放项目生成的可执行文件

此时 CMakeLists.txt 可以这样写

解释一下:

EXECUTABLE_OUTPUT_PATH是cmake系统变量,意思是生成的可执行文件的的目录,我这里把他改为bin目录,因此生成的可执行性文件会出现在bin目录中。

find_library(var lib_name lib_path1 lib_path2)# 函数作用:查找库,并把库的绝对路径和名称存储到第一个参数里# 参数var:用于存储查找到的库# 参数lib_name:想要查找的库的名称,默认是查找动态库,想要指定查找动态库或静态库# 可以加后缀,例如 funcname.so 或 funcname.a # 参数lib_path:想要从哪个路径下查找库,可以指定多个路径
target_link_libraries(target lib_name)# 函数作用:把库lib_name链接到target可执行文件中

课程咨询添加:HCIE666CCIE

↑或者扫描上方二维码


你有什么想看的技术点和内容

可以在下方留言告诉小盟哦!

到此这篇cmake多目录编译(cmake添加多个目录下源文件)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • cjson库输出json文件(json c库)2025-02-25 08:18:08
  • conda如何删除虚拟环境(conda怎么删除环境)2025-02-25 08:18:08
  • ifstream读取文件不存在报错吗?(c++ifstream读取文件)2025-02-25 08:18:08
  • codependence什么意思(coded的意思)2025-02-25 08:18:08
  • 消息认证码mac值(消息认证码mac是否可以用作hmac)2025-02-25 08:18:08
  • git clone 和git checkout区别(git init和git clone)2025-02-25 08:18:08
  • cp1500上市时间(cp1501图解)2025-02-25 08:18:08
  • 消息认证码mac值(mac进行消息认证的过程)2025-02-25 08:18:08
  • console线接法与usb(console线接法图解)2025-02-25 08:18:08
  • enact翻译(ency翻译)2025-02-25 08:18:08
  • 全屏图片