Cmake的CMakeLists.txt写法示例

目录

  1. 示例一:单文件
  2. 示例二:多个源文件
  3. 示例三:将hello.c生成一个库来调用
  4. 示例四:工程分类文件夹编译
  5. 示例五:Cmake的install使用

示例一:单文件

  1. 文件名字为main.cpp,内容如下:
#include <iostream>int main() {printf("Hello World!\n");return 0;
}
  1. CMakeLists.txt文件内容如下,其中:
    a. cmake_minimum_required:对cmake的最低(高)版本的要求。
    b. project:cmake工程的名称,不是强制性的,最好加上。
    c. set:用来定义变量。
    d. add_executable:使用指定的源文件来生成目标可执行文件。
    e. message:输出显示信息。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)add_executable(${PROJECT_NAME} main.cpp)message(${PROJECT_NAME})
  1. CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
  2. 编译时在当前目录新建一个build目录,进行build目录执行:cmake …/ ,产生的临时文件就会在build目录下,不影响源码目录代码。
  3. 最后在此目录执行make命令生成相应的可执行程序。
    a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。

示例二:多个源文件

  1. hello.h头文件内容如下:
    void hello(const char* name);
  2. hello.cpp文件内容:
#include <stdio.h>
#include "hello.h"void hello(const char* name) {printf("Hello my name is %s\n",name);
}
  1. main.c文件内容如下:
#include <iostream>
#include "hello.h"int main() {printf("Hello World!\n");hello("hello");return 0;
}
  1. CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)
set(SRC_LIST main.cpp hello.cpp hello.h)add_executable(${PROJECT_NAME} ${SRC_LIST})message(${PROJECT_NAME})

示例三:将hello.c生成一个库来调用

  1. 如果将hello生成成一个库来调用的话只需要在事例二的基础上修改一下CMakeLists.txt文件再进行编译。
  2. 修改的CMakeLists.txt如下:
    a. add_library:指定的源文件生成链接文件添加到工程中。
    b. target_link_libraries:将目标文件与库文件进行链接。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)
set(LIB_SRC hello.cpp)
set(SRC_LIST main.cpp)add_library(hello ${LIB_SRC})add_executable(${PROJECT_NAME} ${SRC_LIST})target_link_libraries(${PROJECT_NAME} hello)message(${PROJECT_NAME})
  1. 与事例二相比,添加了一个新的目标hello库,并将其链接到我们的cmake-demo程序。
  2. 然后用同样的方法进行cmake和make进行编译。

示例四:工程分类文件夹编译

  1. 如果代码量比较大,会将代码分开放置,进行分类,形成分成多个文件夹。

  2. 比如main.cpp程序放在app目录下面,hello.cpp和hello.h放在libso文件夹下面。
    a. 当前文件夹有一个CMakeLists.txt文件,app和libso文件夹下面也有CMakeLists.txt文件。

  3. 首先看app文件夹的CMakeLists.txt。

project(cmake-demo)include_directories(${PROJECT_SOURCE_DIR}/../../libso)set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)message(${PROJECT_NAME})
  1. 然后看libso文件夹的CMakeLists.txt,其中SHARED表示是生成的动态库,如果把SHARED去掉的话就是生成静态库。
project(helloso)set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})
  1. 最外面文件夹的CMakeLists.txt:
cmake_minimum_required(VERSION 3.21)
project(cmake)add_subdirectory(./app)
add_subdirectory(./libso)

  1. 最后到build目录下执行 cmake …/ 和 make 进行编译。生成目录如下:
    a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。

示例五:Cmake的install使用

  1. cmake中install是将编译好的可执行文件或者生成的库文件放到系统对应的位置,比如说可执行文件直接要放到bin目录下面,so库文件要放到对应的lib目录下面。
  2. 修改上面例子的CMakeLists.txt文件,编辑完成后编译多了install步骤,这样可以在Linux上面使用该执行文件,执行文件会调用so库。即执行命令为:
cmake ../
make
make install
  1. app目录修改的CMakeLists.txt在最后一行加上install:
project(cmake-demo)include_directories(${PROJECT_SOURCE_DIR}/../../libso)set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)message(${PROJECT_NAME})install(TARGETS ${PROJECT_NAME} DESTINATION bin)
  1. libso目录修改的CMakeLists.txt在最后一行加上install:
project(helloso)set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})install(TARGETS ${PROJECT_NAME} DESTINATION ../lib)
  1. 解释:
    a. install(TARGETS ${PROJECT_NAME} DESTINATION bin):安装cmake-demo可执行文件到${CMAKE_INSTALL_PREFIX}/bin目录。
    b. 可以自行打印CMAKE_INSTALL_PREFIX路径,比如/usr/local,注意bin前面不能有/。
    c. 所以执行行文件的路径是/usr/local/bin/,so库文件的安装路径是:/usr/local/…/lib/
    d. 此时可以在Linux系统任何目录里执行./cmake-demo
    e. 如果执行make install的时候出现错误,加上sudo再次执行。

Cmake的CMakeLists.txt写法示例相关推荐

  1. Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译

    转自1:https://www.cnblogs.com/cv-pr/p/6206921.html 转自2:https://blog.csdn.net/qqwangfan/article/details ...

  2. 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法

    在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类: CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22″,"FreeBSD-5.4-R ...

  3. GCC,Clang,make,cmake,makefile,CMakeLists.txt的概念

    gcc和clang gcc和clang是两个不同的编译器 make和cmake make和cmake是搭配编译器来方便用户进行多文件编译而发明的工具 makefile make工具相当于一个智能的批处 ...

  4. 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...

  5. Cmake之CMakeLists.txt

    我们知道makefile是在Linux编译c或者c++代码的时候的一种脚本文件,但是每一个功能都要写一个makefile文件,这样如果这个工程很大,而且相关性比较强的话,makefile的书写就会变得 ...

  6. 多目录cmake工程 CmakeLists.txt编写

    实现类似于vs中工程的CMakeLists.txt的编写.功能为main.cpp调用hello.cpp 的hello()函数,world.cpp的world()函数.使用自动添加多目录下的文件 1.工 ...

  7. “cmake 点点”表示在上一级目录(CMakeLists.txt所在目录)编译

    CMake学习(一)_福尔摩斯帅双的博客-CSDN博客 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . ...

  8. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  9. gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习

    说明 编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程 ...

最新文章

  1. 遂宁专业计算机学校,遂宁计算机专业中职学校哪家强
  2. Entity Framework技巧系列之十一 - Tip 42 - 45
  3. c#中datareader中HasRows属性和Read方法的区别
  4. 19、Java Swing JToolBar:工具栏组件
  5. centos iptables
  6. java学习(165):inetaddress和inetsocketaddress
  7. boost库linux编译安装
  8. LeetCode 759. 员工空闲时间(排序)
  9. [root@dg1 ~]# su - grid ---切换到grid用户
  10. android 图片拍照,Android获取图片拍照时间
  11. vuejs 和 element 搭建的一个后台管理界面
  12. java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
  13. The Apache Tomcat Native library which allows optimal performance in production environments wasn
  14. 使用golang链接达梦数据库
  15. redisson + CacheManager缓存管理
  16. bert系列模型继续预训练(Pytorch)
  17. mybatis错误:Could not resolve resource location pattern [classpath:com/demon/user/mapper/*.xml]: class
  18. coq形式化验证学习进阶
  19. 原来路由器也属于消耗品
  20. 2023 华为 Datacom-HCIE 真题题库 06/12--含解析

热门文章

  1. Tomcat部署时没有项目
  2. 记一次重写easyui的datetimebox控件的小片段
  3. AsyncTask实现断点续传
  4. 【java】Java异常处理总结
  5. row_number() over (partition by....order by...)用法 分组排序
  6. 牛客 - Elo mountains(AC自动机+可持久化数组优化)
  7. HYSBZ - 1208 宠物收养所(Splay)
  8. CodeForces - 858D Polycarp's phone book(字典树/map)
  9. 计算机python技术基础知识点_python基础--相关计算机基础知识
  10. EOJ_1007_环形双向链表