CMake 学习笔记2

其他很好的总结

CMake教程系列-01-最小配置示例 - 知乎

 CMake 保姆级教程(上) | 爱编程的大丙

10-补充(完结)_哔哩哔哩_bilibili

1、基本关键字

SET命令的补充

(1)SET命令设置执行标准

#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)

(2) SET命令设置

set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

第一行:定义一个变量用于存储一个绝对路径
第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

    如果这个路径中的子目录不存在,会自动生成,无需自己手动创建

作者: 苏丙榅
链接: https://subingwen.cn/cmake/CMake-primer/

MESSAGE关键字

向终端输出用户自定义的信息

主要包含三种信息

  • SEND_ERROR,产生错误,生成过程被跳过
  • STATUS,输出前缀--的信息,MESSAGE(STATUS "this is binary dir")
  • FATAL_ERROR,立即终止cmake过程

ADD_EXECUTABLE关键字

生成可执行文件ADD_EXECUTABLE(hello main.cpp)

注意:工程名HELLO和生成的可执行文件hello是没有关系的

cmake 语法基本原则

变量使用${}方式取值,但是在IF控制语句中是直接使用变量名

指令(参数1 参数2 ...)参数使用括弧扩起,参数之间使用空格或分号分开

指令是大小写无关的,参数和变量是大小写相关的,但推荐指令全部大写

语法注意:

set(SRC_LIST main.cpp)可以加双引号 set(SRC_LIST "mian.cpp"),如果名字中有空格则建议加引号

ADD_EXECUTABLE(hello main)后缀可以不写,他会自动取找.c和.cpp但是最好写后缀防止有main这样的可执行文件等文件。

2、内部构建和外部构建

内部构建产生的文件特别多,不方便清理

外部构建会把产生的临时文件放在build下,不会对源文件有任何影响,推荐使用外部构建方式

mkdir build

cd build

cmake ..

make

3、工程配置 make install

可以用src文件夹放源码,可以在工程中添加脚本runhello.sh来调用hello二进制。将构建后的文件放到bin子目录

3.1 将生成文件放到bin

mkdir src

mv main.cpp src/

cd src

touch CMakeList.txt(src 下)

cd ..

touch CMakeList.txt(工程下)

==========================

CMakeList.txt(工程下)

PROJECT(HELLO)

ADD_SUBDIRECTORY(src bin)  #关联src

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)#安装文件

INSTALL(PROGRAMS runhello.sh DESTINATION bin)#安装脚本

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)#安装doc下的hello.txt

CMakeList.txt(src下)

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目录下

3.2安装COPYRIGHT和README

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

FILES文件

DESTINATION:写绝对路径,可以写相对路径,相对路径实际路径是

${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>

CMAKE_INSTALL_PREFIX 默认在、usr/local/

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

3.3安装脚本runhello.sh

PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

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

3.4安装doc中的hello.txt

一是通过在doc目录建立CMakeList.txt,通过install下的file

二是直接在工程目录通过

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

DIRECTORY后面连接的是所在source目录的相对路径

注意:abc/和abc有很大区别。不以/结尾,这个目录将被安装位目标路径下。以/结尾,这个目录中的内容将安装到目标路径

4、静态库和动态库构建

4.1

tree:

├── build
├── CMakeLists.txt
└── lib
    ├── CMakeLists.txt
    ├── hello.cpp
    └── hello.h

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;
}

CMakeLists.txt外层

PROJECT(HELLO)

ADD_SUBDIRECTORY(lib bin)

CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARE ${LIBHELLO_SRC})#生成共享库

ADD_LIBRARY

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

hello:就是正常的库名,生成的名字会加上lib,最终文件是libhello.lib

SHARED,动态库,STATIC,静态库

${LIBHELLO_SRC}:源文件

4.2同时构建静态库和动态库

SET_TARGET_PROPERTIES

这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本

相关推荐

  1. cmake学习笔记2

    2024-04-14 14:36:02       40 阅读
  2. Cmake学习笔记3

    2024-04-14 14:36:02       41 阅读
  3. CMake 学习笔记(访问Python)

    2024-04-14 14:36:02       28 阅读
  4. CMAKE学习

    2024-04-14 14:36:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 14:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 14:36:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 14:36:02       82 阅读
  4. Python语言-面向对象

    2024-04-14 14:36:02       91 阅读

热门阅读

  1. JVM复习

    JVM复习

    2024-04-14 14:36:02      32 阅读
  2. Iterator 和 ListIterator 有什么区别?

    2024-04-14 14:36:02       44 阅读
  3. 实现栈的各种基本运算的算法(数据结构)

    2024-04-14 14:36:02       43 阅读
  4. 北斗导航 | 北斗三号区域短报文服务解析

    2024-04-14 14:36:02       39 阅读
  5. Linux和Windows的主要区别

    2024-04-14 14:36:02       40 阅读