CMake学习

news/2024/10/30 23:19:07/

CMake一个HelloWord

  • main.cpp
#include <iostream>using namespace std;int main() {cout << "Hello World" << endl;
}
  • CMakeLists.txt
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
  • 使用cmake .,生成makefile文件
  • 使用make命令编译
  • 最终生成hello可执行程序

语法介绍

  • PROJECT:指定⼯程的名字和⽀持的语⾔,默认⽀持所有语⾔。

    PROJECT (HELLO) 指定了⼯程的名字,并且⽀持所有语⾔—建议
    PROJECT (HELLO CXX) 指定了⼯程的名字,并且⽀持语⾔是C++
    PROJECT (HELLO C CXX) 指定了⼯程的名字,并且⽀持语⾔是C和C++

    使用该指定隐式的定义了两个CMAKE变量,HELLO_BINARY_DIRHELLO_SOURCE_DIR,如果改了⼯程名,这两个变量名也会改变。

  • SET:用来显示的指定变量

    SET(SRC_LIST main.cpp) : SRC_LIST变量就包含了main.cpp
    也可以 SET(SRC_LIST main.cpp t1.cpp t2.cpp)

  • MESSAGE关键字

    向终端输出用户自定义的信息
    主要包含三种信息:

      - SEND_ERROR,产⽣错误,⽣成过程被跳过。- SATUS,输出前缀为 —— 的信息。- FATAL_ERROR,⽴即终⽌所有 cmake 过程。
    
  • ADD_EXECUTABLE关键字:⽣成可执⾏⽂件

    ADD_EXECUTABLE(hello ${SRC_LIST}) : ⽣成的可执⾏⽂件名是hello,源⽂件读取变量SRC_LIST中的内容,也可以直接写 ADD_EXECUTABLE(hello main.cpp)

  • 简化版 hello world

    PROJECT(HELLO) 
    ADD_EXECUTABLE(hello main.cpp)
    

    注意:⼯程名的 HELLO 和⽣成的可执⾏⽂件 hello 是没有任何关系的

语法的基本原则

  • 变量使⽤${}⽅式取值,但是在 IF 控制语句中是直接使⽤变量名
  • 指令(参数 1 参数 2…) 参数使⽤括弧括起,参数之间使⽤空格分号分开。 以上⾯的ADD_EXECUTABLE 指令为例,如果存在另外⼀个 func.cpp 源⽂件。就要写成:ADD_EXECUTABLE(hello main.cpp func.cpp)或者ADD_EXECUTABLE(hello main.cpp;func.cpp)
  • 指令是⼤⼩写⽆关的,参数和变量是⼤⼩写相关的。但,推荐你全部使⽤⼤写指令。
  • 注意事项
    • SET(SRC_LIST main.cpp) 可以写成 SET(SRC_LIST “main.cpp”),如果源⽂件名中含有空格,就必须要加双引号
    • ADD_EXECUTABLE(hello main) 后缀可以不加,他会⾃动去找.c和.cpp,最好不要这样写,可能会有这两个⽂件main.cpp和main

内部构建和外部构建

  • 上述例⼦就是内部构建,他⽣产的临时⽂件特别多,不⽅便清理。
  • 外部构建,就会把⽣成的临时⽂件放在build⽬录下,不会对源⽂件有任何影响,强烈推荐使⽤外部构建⽅式。

外部构建举例

  1. 建⽴⼀个build⽬录,可以在任何地⽅,建议在当前⽬录下
  2. 进⼊build,运⾏cmake .. 当然 .. 表示上⼀级⽬录,你可以写CMakeLists.txt所在的绝对路径,⽣产的⽂件都在build⽬录下了
  3. 在build⽬录下,运⾏make来构建⼯程

注意外部构建的两个变量

  • HELLO_SOURCE_DIR 还是⼯程路径
  • HELLO_BINARY_DIR 编译路径 也就是 / *** / *** /bulid
    在这里插入图片描述

Hello World 看起来更像工程

  • 为⼯程添加⼀个⼦⽬录 src,⽤来放置⼯程源代码
  • 添加⼀个⼦⽬录 doc,⽤来放置这个⼯程的⽂档 hello.txt
  • 在⼯程⽬录添加⽂本⽂件 COPYRIGHT, README
  • 在⼯程⽬录添加⼀个 runhello.sh 脚本,⽤来调⽤ hello ⼆进制
  • 将构建后的⽬标⽂件放⼊构建⽬录的 bin ⼦⽬录
  • 将 doc ⽬录 的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/

在这里插入图片描述
外层CMakeList.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

src下的CMakeLists.txt

ADD_EXECUTABLE(hello main.cpp)
  • ADD_SUBDIRECTORY 指令
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- 这个指令⽤于向当前⼯程添加存放源⽂件的⼦⽬录,并可以指定中间⼆进制和⽬标⼆进制存放的位置
- EXCLUDE_FROM_ALL函数是将写的⽬录从编译中排除,如程序中的example
- ADD_SUBDIRECTORY(src bin):- 将 src ⼦⽬录加⼊⼯程并指定编译输出(包含编译中间结果)路径为bin ⽬录- 如果不进⾏ bin ⽬录的指定,那么编译结果(包括中间结果)都将存放在build/src ⽬录
  • 更改⼆进制的保存路径
    • SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量 来指定最终的⽬标⼆进制的位置
      SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 
      SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
      
    • 哪⾥要改变⽬标存放路径,就在哪⾥加⼊上述的定义,所以应该在src下的CMakeLists.txt下写

安装

  • ⼀种是从代码编译后直接 make install 安装
  • ⼀种是打包时的指定 ⽬录安装。
    • 简单的可以这样指定⽬录:make install DESTDIR=/tmp/test
    • 稍微复杂⼀点可以这样指定⽬录:./configure –prefix=/usr

安装HelloWord

使⽤CMAKE⼀个新的指令:INSTALLINSTALL的安装可以包括:⼆进制、动态库、静态库以及⽂件、⽬录、脚本等。

使⽤CMAKE⼀个新的变量:CMAKE_INSTALL_PREFIX

在这里插入图片描述

安装⽂件COPYRIGHT和README

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)

FILES:⽂件

DESTINATION:

1、写绝对路径

2、可以写相对路径,相对路径实际路径是:${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>

CMAKE_INSTALL_PREFIX 默认是在 /usr/local/

cmake -DCMAKE_INSTALL_PREFIX=/usr 在 cmake 的时候指定 CMAKE_INSTALL_PREFIX 变量的路径

安装脚本runhello.sh

PROGRAMS:⾮⽬标⽂件的可执⾏程序安装(⽐如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

说明:实际安装到的是 /usr/bin

安装doc中的hello.txt

  • 通过在 doc ⽬录建⽴CMakeLists.txt ,通过install下的file

  • 直接在⼯程⽬录通过INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

    DIRECTORY 后⾯连接的是所在 Source ⽬录的相对路径

    注意:abc 和 abc/有很⼤的区别
    ⽬录名不以 / 结尾:这个⽬录将被安装为⽬标路径下的
    ⽬录名以 / 结尾:将这个⽬录中的内容安装到⽬标路径

在这里插入图片描述

静态库和动态库的构建

静态库和动态库的区别:

  • 静态库的扩展名⼀般为“.a”或“.lib”;动态库的扩展名⼀般为“.so”或“.dll”。
  • 静态库在编译时会直接整合到⽬标程序中,编译成功的可执⾏⽂件可独⽴运⾏
  • 动态库在编译时不会放到连接的⽬标程序中,即可执⾏⽂件⽆法单独运⾏。

在这里插入图片描述

hello.h中的内容

#ifndef HELLO_H
#define Hello_H
void HelloFunc();
#endif

hello.cpp中的内容

#include "hello.h"
#include <iostream>
void HelloFunc(){std::cout << "Hello World" << std::endl;
}

项⽬中的cmake内容

PROJECT(HELLO)
ADD_SUBDIRECTORY(lib bin)

lib中CMakeLists.txt中的内容

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
  • ADD_LIBRARY

    • hello:就是正常的库名,⽣成的名字前⾯会加上lib,最终产⽣的⽂件是libhello.so
    • SHARED,动态库 ; STATIC,静态库
    • ${LIBHELLO_SRC} :源⽂件
  • 同时构建动态库和静态库 SET_TARGET_PROPERTIES

lib下CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
//对hello_static的重名为hello
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
//cmake 在构建⼀个新的target 时,会尝试清理掉其他使⽤这个名字的库,因为,在构建 libhello.so 时, 就会清理掉 libhello.a
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)

同时可以修改版本号

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

安装共享库和头⽂件

//⽂件放到该⽬录下
INSTALL(FILES hello.h DESTINATION include/hello)
//⼆进制,静态库,动态库安装都⽤TARGETS
//ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执⾏⽬标⼆进制。
INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

使用可以通过 INCLUDE_DIRECTORIES

INCLUDE_DIRECTORIES(/usr/include/hello)

找到引⽤的函数问题

  • 关键字:LINK_DIRECTORIES 添加⾮标准的共享库搜索路径
  • 关键字:TARGET_LINK_LIBRARIES 添加需要链接的共享库

http://www.ppmy.cn/news/266994.html

相关文章

RL - 强化学习 马尔可夫决策过程 (MDP) 转换 马尔可夫奖励过程 (MRP)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131097165 马尔可夫决策过程&#xff08;Markov Decision Process&#xff0c;MDP&#xff09;和马尔可夫奖励过程&#xff08;Markov R…

Mac CAD2018 安装完成后,打开注册机时出现 应用程序“02_注册机”不能打开。

问题描述&#xff1a; Mac CAD2018 安装完成后&#xff0c;打开注册机时出现 应用程序“02_注册机”不能打开。如下图&#xff1a; 解决方法&#xff1a; 从新下载注册机&#xff0c; 下载方法&#xff1a;关注wx公-众-.号&#xff1a; 91软件安装&#xff0c;回复“mac0011…

AutoCAD各版本对应的R版本参数值及其对应注册表中的数值(2002-2023)

AutoCAD各版本对应的R版本参数&#xff08;注册表中的数值参数&#xff09;&#xff0c;有时候我们进行CAD平台的二次开发时需要知道AutoCAD2002或AutoCAD2014等版本对应的是R多少的问题&#xff0c;地理信息网给您提供AutoCAD各版本对应注册表的参数&#xff0c;供您参考。 1…

AutoCAD2020中文版软件下载和安装教程|兼容WIN10

AutoCAD2020中文版软件下载和安装教程|兼容WIN10 下载链接 CAD 2020(64位)下载链接&#xff1a; http://www.zhanshaoyi.com/10534.html 软件介绍 软件简介&#xff1a; AutoCAD是由欧特克公司开发一款功能非常强大的计算机辅助设计软件&#xff0c;主要应用于二维、三维绘…

AutoCAD Mechanical v2022.1.2 CAD机械版简体中文精简直装版

AutoCAD软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件&#xff0c;可以用于绘制二维制图和基本三维设计&#xff0c;通过它无需懂得编程&#xff0c;即可自动制图&#xff0c;因此它在全球广泛使用&#xff0c;可以用于土木建筑&#xff0c;装饰装潢&…

AutoCAD 2019 汉化包

AutoCAD 2019 mac破解版终于更新啦&#xff0c;MAC OS X平台上最专业的CAD三维设计绘图软件。AutoCAD 2019破解版支持目前最新的MacOS Mojave系统&#xff0c;新版图标全新设计&#xff0c;视觉效果更清晰&#xff1b;在功能方面&#xff0c;全新的共享视图功能、DWG 文件比较功…

在价格战中苦苦挣扎的小鹏汽车和蔚来,哪个是最好的电动汽车股?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; 从长期来看&#xff0c;小鹏汽车(XPEV)的基本面优于蔚来(NIO)&#xff0c;小鹏汽车目前的估值也更有吸引力&#xff0c;在全球电动汽车行业中也具有更好的长期投机性。 猛兽财经的投资组合中其中有一部分…

【MySql】MySql的数据类型

文章目录 数据类型分类数值类型tinyint类型bit类型小数类型floatdecimal 字符串类型charvarchar日期和时间类型enum和set 数据类型分类 对于数据类型分类&#xff0c;这里简单分为数值类型&#xff08;如BIT,BOOL,INT&#xff09;&#xff0c;文本、二进制类型&#xff08;如CH…