CMake 常用总结一:CMake 单个文件目录

2023-05-16

引言

CMake 实践帮助我们对 CMake 有一个系统全面的了解,并且有大量示例以供参考,至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake 。

阅读完 CMake 实践文档,认为自己的任务也就结束了,可这样总感觉不是自己的东西,不如整理一下并吸收其中自己认为最有用的东西,这样也能极大的减轻自己的记忆负担。

与此同时 CMake 实践行文组织过于复杂,不方便遇到问题时快速查阅,所以我做了一些调整与总结,希望能够对读者更加友好。

本文不能代替 CMake 实践文档,有时间还是把 CMake 实践文档认真阅读一遍。

CMake 常用总结

CMake 背景

在 C/C++ 开发中,我们常听人聊 CMake,那么 CMake 到底是什么呢 ?——高级编译配置工具

实际工作中,一个大型项目往往由多个人共同开发维护,其中的文件常常是不计其数,这些文件按类型、功能、模块分别放在若干个目录中,最终要输出一个可执行文件或者共享库(dll,so等等)。那如何实现这一目的呢?这时候神器就出现了—— CMake!所有操作都是通过编译 CMakeLists.txt 来完成。

CMake主要解决两个问题:

  1. 大量代码的关系维护

    大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护。

    把代码维护命令及编译命令写在 CMakeLists.txt 文件中,然后再用 cmake 工具解析此文件自动执行相应命令,可实现代码的合理编译。

  2. 减少重复编译时间

    在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间。

官方网站是 www.cmake.org,有兴趣的朋友可以通过访问官方网站获得更多关于 CMake的信息。

CMake 安装

关于 CMake 的安装可以参考:Ubuntu中安装Cmake,这里就不过多介绍了。

CMake 单个文件目录

原始工程结构

CMake 简单实例

先来一个简单地 CMake 实例,对 CMake 有一个简单、直接的了解!

  1. 创建一个 .cpp 文件,并命名为 main。

    // # main.cpp
    
    #include <iostream>
    
    int main() {
    	std::cout <<  "hello world" << std::endl;
    }
    
  2. 创建 CMakeLists.txt 文件(目前不需要了解具体内容,下文会详细介绍)。

    # 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})
    
  3. 使用 cmake,生成 makefile 文件。

    CMake 操作成功后,当前目录下会生成相应目录与文件,包括:CMakeFiles 目录,CMakeCache.txt 文件,cmake_install.cmake 文件,并且生成了Makefile

    现在不需要理会这些文件的作用,以后你也可以不去理会。最关键的是,它自动生成了Makefile,如下所示:

    yxm@192:~/myshare/test1$ cmake .
    CMake Warning (dev) in CMakeLists.txt:
      Syntax Warning in cmake code at
    
        /home/yxm/myshare/CMakeLists.txt:9:37
    
      Argument not separated from preceding token by whitespace.
    This warning is for project developers.  Use -Wno-dev to suppress it.
    
    -- The C compiler identification is GNU 5.4.0
    -- The CXX compiler identification is GNU 5.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- This is BINARY dir /home/yxm/myshare
    -- This is SOURCE dir /home/yxm/myshare
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/yxm/myshare
    yxm@192:~/myshare$ ls
    CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  main.cpp  Makefile
    

    cmake . 后面的点号代表本目录

  4. 使用 make 命令编译 Makefile 文件。

    编译成功后,将会生成可执行文件,本案例中将生成 Hello 的可执行程序。

    yxm@192:~/myshare/test1$ make
    Scanning dependencies of target hello
    [100%] Building CXX object CMakeFiles/hello.dir/main.cpp.o
    Linking CXX executable hello
    [100%] Built target hello
    yxm@192:~/myshare$ ls
    CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  hello  main.cpp  Makefile
    
  5. 运行程序获得运行结果。

    yxm@192:~/myshare/test1$ ./hello 
    hello world
    

CMake 语法

(1)PROJECT 语法

  • 指令:PROJECT

  • 语法:PROJECT(projectname [CXX] [C] [Java])

  • 说明:用于指定⼯程名称,并可指定工程支持的语⾔(支持的语⾔列表可以忽略,默认支持所有语言) 。 这个指令隐式的定义了两个 CMake 变 量 :

    <projectname>_BINARY_DIR:本例中是 HELLO_BINARY_DIR

    <projectname>_SOURCE_DIR :本例中是 HELLO_SOURCE_DIR

    问题:如果改了工程名,这两个变量名也会改变?

    CMake 帮我们预定义 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR 变量。建议使用这两个变量,即使修改了⼯程名称,也不会影响这 两个变量。如果使⽤了<projectname>_SOURCE_DIR,修改⼯程名称后,需要同时修改这些变量。所以上文例子中 CMakeLists.txt 文件可以修改为:

    MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})
    

(2)SET 语法

  • 指令:SET
  • 语法:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
  • 说明:⽤来显式的定义变量,⽐如 :
    • 如果有单个源⽂件,可以定义成 SET(SRC_LIST main.c),SRC_LIST 变量就代表 main.cpp;
    • 如果有多个源⽂件,也可以定义成 SET(SRC_LIST main.c t1.c t2.c),多个文件之间可以用空格或者分号来进行分割。

(3)MESSAGE 语法

  • 指令:MESSAGE

  • 语法:MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)

  • 说明:⽤于向终端输出⽤户定义的信息,它包含了三种类型:

    SEND_ERROR:产⽣错误,⽣成过程被跳过。

    STATUS:输出前缀为 – 的信息。

    FATAL_ERROR:立即终止所有cmake过程。

(4)ADD_EXECUTABLE 语法

  • 指令:ADD_EXECUTABLE

  • 语法:ADD_EXECUTABLE([BINARY] [SOURCE_LIST])

  • 说明:用于⽣成⼀个⽂件名为 [BINARY] 可执⾏⽂件 , 相关的源⽂件是 SOURCE_LIST 中定义的源⽂件列表。

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

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

CMake 语法的基本原则

(1)语法本原则

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

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

    以上面的 ADD_EXECUTABLE 指令为例,如果存在另外一个 func.cpp 源文件就要写成:ADD_EXECUTABLE(hello main.cpp func.cpp) 或者 ADD_EXECUTABLE(hello main.cpp;func.cpp)

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

(2)语法注意事项

  • SET(SRC_LIST main.cpp) 可以写成 SET(SRC_LIST “main.cpp”),如果源文件名中含有空格,就必须要加双引号。
  • ADD_EXECUTABLE(hello main) 后缀可以不写,他会自动去找 .c 和 .cpp,最好不要这样写,可能会有这两个文件main.cpp和main。

(3)生产debug版本的方法

cmake … -DCMAKE_BUILD_TYPE=debug

生成可调试的版本之后,可以使用gdb工具对程序进行调试。

CMake 内部构建问题

上面的例子是单个文件目录结构,展示的是内部构建,即通过内部编译进行工程构建。这种方式会产生冗余的临时文件(中间文件),比如CMakeFiles 目录,CMakeCache.txt 文件,cmake_install.cmake 文件,这些文件占用空间、打乱原有目录结构且不方便清理。

改进工程结构

CMake 外部构建

如上文所述,对于 CMake而言,内部编译生成了一些无法自动删除的中间文件,所以引出了我们对外部编译的探讨。

外部构建,即通过外部编译进行工程构建,会把生成的临时文件放在build目录下,不会对原有的工程有任何影响,所有动作全部发生在编译目录,所以推荐大家使用外部构建方式,如下所示:

  1. 创建以下工程结构

    yxm@192:~/myshare/test2$ tree
    .
    ├── build
    ├── CMakeLists.txt
    └── main.cpp
    
  2. main.cpp 与上面的 main.cpp 内容相同。

  3. 进入 build,运行 cmake …(…表示上一级目录,也可以写CMakeLists.txt所在的绝对路径),产生的中间文件都在 build 目录下。

  4. 在 build 目录下,运行 make 命令编译 Makefile 文件。

注意外部构建的两个变量

  • HELLO_SOURCE_DIR 还是工程路径,即 ~/myshare/test2
  • HELLO_BINARY_DIR 则是编译路径,也就是 ~/myshare/test/bulid

CMake 工程结构的完善

实际工程中还会存在许多非源码文件,如何规范的放置这些文件呢?

  • 为工程添加一个子目录 src,用来放置工程源代码
  • 添加一个子目录 doc,用来放置这个工程的文档 hello.txt
  • 在工程目录添加文本文件 COPYRIGHT(版权),README(看我的信息)
  • 在工程目录添加一个 runhello.sh 脚本,用来调用 hello 二进制
  • 将构建后的目标文件放入构建目录的 bin 子目录
  • 将 doc 目录 的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/

(1)将目标文件放入构建目录的 bin 子目录

  1. 补充工程结构:每个目录下都要有一个CMakeLists.txt 说明。

    yxm@192:~/myshare/test2$ tree
    .
    ├── build
    ├── CMakeLists.txt
    └── src
        ├── CMakeLists.txt
        └── main.cpp
    
  2. 外层 CMakeLists.txt 内容如下:

    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src bin) # 详细见下文 CMake 语法中第一条
    
  3. src 下的 CMakeLists.txt 内容如下:

    ADD_EXECUTABLE(hello main.cpp)
    
  4. 外部编译过程:

    1. 进入 build,运行 cmake …
    2. 在 build 目录下,运行 make 命令编译 Makefile 文件,生成的可执行文件存放在 src/bin 目录下。

(2)换个地方保存目标二进制

SET 指令可以重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置(本例中指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

所以,上面两个指令分别定义了:可执行二进制的输出路径为build/bin 和库的输出路径为build/lib。本节我们没有提到共享库和静态库的构建,所以,你可以不考虑第二条指令。

(3)修改 CMake 支持安装

支持安装需要使用 CMake 一个新的指令:INSTALL;还需要使用 CMake 一个新的变量:CMAKE_INSTALL_PREFIX,该变量用于指定安装路径( 详细可以看下文 CMake 语法)。

  1. 补充工程结构:

    yxm@192:~/myshare/test2$ tree
    .
    ├── build
    ├── CMakeLists.txt
    ├── COPYRIGHT
    ├── doc
    │   └── hello.txt
    ├── README
    ├── runhello.sh
    └── src
        ├── CMakeLists.txt
        └── main.cpp
    
  2. 安装文件 COPYRIGHT (版权) 和 README (说明)

    修改外层CMakeLists.txt,添加 INSTALL 指令

    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src bin)
    INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
    

    FILES:文件

    DESTINATION:路径

    • 可以写绝对路径
    • 可以写相对路径,实际路径是:${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>,CMAKE_INSTALL_PREFIX 默认是在 /usr/local/,所以 INSTALL 中的share/doc/cmake/ 就相当于/usr/local/share/doc/cmake/
  3. 安装脚本 runhello.sh

    修改外层CMakeLists.txt,添加 INSTALL 指令

    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src bin)
    INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
    INSTALL(PROGRAMS runhello.sh DESTINATION bin)
    

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

    DESTINATION:参考上文第二点,上面实际应该安装到/usr/local/bin

  4. 安装目录 doc 以及目录中的 hello.txt,有两种方式:

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

    • 另一种是直接在工程目录通过

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

    修改外层CMakeLists.txt,添加 INSTALL 指令

    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src bin)
    INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
    INSTALL(PROGRAMS runhello.sh DESTINATION bin)
    INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)
    

    DIRECTORY 后面连接的是所在 Source 目录的相对路径。注意:abc 和 abc/ 区别:

    • 目录名不以/结尾:这个目录将被安装为目标路径下的
    • 目录名以/结尾:将这个目录中的内容安装到目标路径

    DESTINATION:参考上文第二点

  5. 外部编译过程:

    1. 进入 build,运行 cmake …

    2. 在 build 目录下,运行 make 命令编译 Makefile 文件,生成的可执行文件存放在 src/bin 目录下。

    3. 在 build 目录下安装 make install,将安装一下文件:

    在这里插入图片描述

    安装有以下几种方法:

    • 一种是从代码编译后直接 make install 安装,本例子就是使用这种方法
    • 一种是打包时的指定目录安装。
      • 简单的可以这样指定目录:make install DESTDIR=/tmp/test
      • 稍微复杂一点可以这样指定目录:./configure –prefix=/usr

CMake 语法

(1)DCMAKE_INSTALL_PREFIX 语法

CMAKE_INSTALL_PREFIX 该变量用于表示传递安装⽬录,默认的安装目录是 /usr/local/;

也可以在 cmake 的时候指定CMAKE_INSTALL_PREFIX 变量的路径,如下:

cmake -DCMAKE_INSTALL_PREFIX=/usr     # -D之后加不加空格都可

(2)ADD_SUBDIRECTORY 语法

  • 指令:ADD_SUBDIRECTORY

  • 语法:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

  • 说明:用于向当前⼯程添加存放源⽂件的⼦⽬录,并可以指定中间⼆进制和⽬标⼆进制存放的位置。

    EXCLUDE_FROM_ALL参数的含义是将这个⽬录从编译过程中排除,⽐如⼯程的example,可能就需要⼯程构建完成后,再进⼊example⽬录单独进⾏构建(当然,你也可以通过定义依赖来解决此类问题) 。

    上文中 ADD_SUBDIRECTORY(src bin) 是将 src 子目录加入工程并指定编译输出(包含编译中间结果)路径为 bin 目录;如果不进行 bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录。

(3)INSTALL 语法

INSTALL 指令⽤于定义安装规则,安装的内容可以包括⽬标⼆进制、动态库、静态库以及⽂件、⽬录、脚 本等。INSTALL 指令包含了各种安装类型,我们需要⼀个个分开解释:

  • 类型:⽬标⽂件

    • 语法:INSTALL(TARGETS targets…

      ​ [[ARCHIVE|LIBRARY|RUNTIME]

      ​ [DESTINATION <dir>]

      ​ [PERMISSIONS permissions…]

      ​ [CONFIGURATIONS

      ​ [Debug|Release|…]]

      ​ [COMPONENT <component>]

      ​ [OPTIONAL]

      ​ ] […])

    • 说明:参数中的 TARGETS 后⾯跟的就是我们通过 ADD_EXECUTABLE 或者ADD_LIBRARY 定义的⽬标⽂件,可能是可执⾏⼆进制、动态库、静态库。

      ⽬标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执⾏⽬标⼆进制。

      DESTINATION定义了安装的路径。

  • 类型:普通⽂件

    • 语法:INSTALL(FILES files… DESTINATION <dir>

      ​ [PERMISSIONS permissions…]

      ​ [CONFIGURATIONS [Debug|Release|…]]

      ​ [COMPONENT <component>]

      ​ [RENAME <name>] [OPTIONAL])

    • 说明:可⽤于安装⼀般⽂件,并可以指定访问权限,⽂件名是此指令所在路径下的相对路径。如果默认 不 定 义 权 限 PERMISSIONS , 安 装 后 的 权 限 为 : OWNER_WRITE, OWNER_READ, GROUP_READ,和WORLD_READ,即644权限。

  • 类型:⾮⽬标⽂件的可执⾏程序(如脚本之类)

    • 语法:INSTALL(PROGRAMS files… DESTINATION <dir>

      ​ [PERMISSIONS permissions…]

      ​ [CONFIGURATIONS [Debug|Release|…]]

      ​ [COMPONENT <component>]

      ​ [RENAME <name>] [OPTIONAL])

    • 说明:跟上⾯的 FILES 指令使⽤⽅法⼀样 , 唯⼀的不同是安装后权限为 : OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限。

  • 类型:⽬录

    • 语法:INSTALL(DIRECTORY dirs… DESTINATION <dir>

      ​ [FILE_PERMISSIONS permissions…]

      ​ [DIRECTORY_PERMISSIONS permissions…]

      ​ [USE_SOURCE_PERMISSIONS]

      ​ [CONFIGURATIONS [Debug|Release|…]]

      ​ [COMPONENT <component>]

      ​ [[PATTERN <pattern> | REGEX <regex>]

      ​ [EXCLUDE] [PERMISSIONS permissions…]] […])

    • 说明:主要介绍其中的DIRECTORY、PATTERN和PERMISSIONS参数:

      • DIRECTORY:后⾯连接的是所在Source⽬录的相对路径。
      • PATTERN:⽤于使⽤正则表达式进⾏过滤。
      • PERMISSIONS:⽤于指定PATTERN过滤后的⽂件权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake 常用总结一:CMake 单个文件目录 的相关文章

  • PX4应用程序开机自启动

    修改启动脚本 新版本的PX4固件这些rc文件位置为 xff1a PX4 Autopilot ROMFS px4fmu common init d文件夹中 1 以rc为开头的都是飞控的启动脚本的文件 xff0c 通过这些文件决定那些应用程序应
  • 自由链表(free list)——SGI STL的空间配置器(allocator)第二级配置器维护方法

    参考 xff1a STL源码剖析 以及 STL空间配置器之第二级配置器的free list详解 span class token comment free list的节点 span span class token keyword unio
  • 【C语言 Linux系统开发 视频课程学习笔记】

    学习的课程在b站 xff1a 史上最强最细腻的linux嵌入式C语言学习教程 李慧芹老师 感谢李老师 xff01 感谢up主 xff01 本篇博客只是收集一下学习过程中遇到的函数和其他知识点 xff0c 并不会详细展开 某个函数的具体情况还
  • pthread线程私有数据TSD 几点测试结果

    更加详细的内容查看man手册或百度 xff0c 这里只是几个实际测试的结果 仅代表实验现象 xff0c 并不考虑实现原理 pthread key t key可以定义为全局变量 xff0c 全局变量属于所有线程共有的 在不同的线程中可以用pt
  • 【muduo库】server端流程图

    1 首先是根据陈硕老师的muduo库手册p11的类图 xff0c 结合自己的学习所得画的一个更详细的流程 xff0c 使用IO线程池与计算线程池 xff08 1 xff09 计算线程中 xff0c task 调用TcpConnection
  • std::bind实现在类外访问类私有成员函数

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 树莓派(linux)安装scipy

    这里写目录标题 成功案例失败案例1 xff08 使用pip直接安装 xff09 失败案例2 xff08 使用pip安装依赖 xff09 命令安装yum使用alien 失败案例3 xff08 whl 43 setup py安装 xff09 查
  • 计算机的基本组成

    一个完整的计算机系统包括硬件系统和软件系统两大部分 xff1a 硬件系统 xff1a 是我们肉眼所见的实体 如 xff1a 电源 显示器 主机箱等 软件系统 xff1a 是我们使用的程序 xff0c 如 xff1a 微信 QQ音乐 浏览器等
  • pycharm关闭拼写检查

    pycharm默认会对函数名 xff0c 类名进行拼写检查 xff0c 不符合规则的会有一些提示和警告 xff0c 虽然不会影响程序运行 xff0c 但是看着还是比较不爽 xff0c 所以写一下关闭拼写检查的方法 打开pycharm xff
  • ROS基础——tf相关

    service和srv 我们有一个节点A会计算出右臂逆向关节运动学坐标 xff0c 我们有一个节点B xff0c 不会经常用到 xff0c 但是偶尔会用到节点A的这个坐标 假设我们用主题来通信 xff0c 那么我们的节点A要不停的来发布消息
  • EPICS的学习过程

    在此之前 xff0c 最好先学习下Linux系统的基本操作 一 了解什么是EPICS 了解EPICS base Channel Access IOC OPI 的概念 高能所内网可参考这些材料 xff1b 打开USPAS xff0c 熟悉其大
  • CentOS 7下ArchiveViewer的安装与使用

    1 下载 安装jdk 下载安装包https www oracle com java technologies downloads java8 xff1b 解压 xff1b 将 JAVA HOME bin路径添加到 PATH中 注意 xff1
  • CentOS7 安装 Archiver Appliance 的 Grafana服务

    1 安装 Grafana 7 采用rpm的安装方式 xff1a span class token function wget span https dl grafana com enterprise release grafana ente
  • AA中策略文件的使用

    一 AA策略文件 AA中关于存储策略设置的文件主要有两个 xff1a policies py archappl properties 每个appliance只有一个archappl properties和policies py文件 xff0
  • AA的管理

    1 AA的整体代码结构 AA代码的设计遵循了MVC模式 xff0c 将模型层 xff08 数据端 xff09 视图层 xff08 web客户端 xff09 控制层分离 数据端 xff08 M xff09 利用StoragePlugin接口建
  • CentOS 7下 VNC 服务的配置和开启、常见问题

    文章目录 1 X server Xvnc 和 VNC serverX Window SystemX ServerX ClientX Window ManagerDisplay ManagerX Window启动方式方式一 xff1a sta
  • AA部署中,修改Context属性造成的问题

    此处利用了https github com jeonghanlee epicsarchiverap env将AA安装在 opt epicsarchiverap 下 xff0c 并以系统服务的方式启停 问题产生原因 地球人都知道 xff0c
  • CentOS 7 下安装 Olog-es(Phoebus-olog)

    介绍报告 Olog es 服务端安装包 GitHub Olog phoebus olog Online logbook for experimental and industrial logging web服务端安装包 GitHub Olo
  • 视频监控系统安装和使用过程中的常见问题

    1 视频卡顿 花屏 当已确定POE供电距离在何时范围内时 xff0c 有可能是网线接线不规范或是网线损坏导致 对于POE供电距离较远 网络带宽较大的 xff0c 尽量连接在POE交换机的红口 xff08 红口保障 xff09 2 NVR的初
  • 关于CIDR地址的计算方法

    CIDR无类域间路由 xff0c 打破了原本的ABC类地址的规划限定 xff0c 使用地址段分配更加灵活 xff0c 日常工作中也经常使用 xff0c 也正是因为其灵活的特点使我们无法一眼辨认出网络号 广播地址 网络中的第一台主机等信息 x

随机推荐

  • EPICS CA请求能否成功的影响因素

    1 子网和广播域 子网掩码和广播域互为互补的网段 例如 xff1a 10 0 2 235的掩码为255 255 0 0 xff0c 则它所在的子网为10 0 0 0 xff0c 广播域为10 0 255 255 xff1b 192 168
  • 服务器采购和选型

    1 CPU 双路CPU xff0c 0号位和1号位 xff0c 只要0号位CPU正常 xff0c 服务器就能工作 xff0c 若1号位CPU故障 xff0c 服务器会报警 若0号位CPU故障 xff0c 1号位CPU正常 xff0c 服务器
  • CentOS 7自定义系统服务(以Phoebus-Olog为例)

    需要开启的服务 xff1a MongoDBElasticSearchPhoebus Olog后端服务Phoebus Olog web client前端服务 配置系统服务的方式 xff1a systemd 把spring boot项目配置为L
  • 在未联网的计算机中部署 yum 源和 EPICS 环境

    1 基本背景 EPICS 软件仓库 xff1a 192 168 206 234 8888 安装方式 xff1a yum 2 配置跳板机 跳板机功能 xff1a 借助ssh 隧道服务进行端口转发 xff0c 使未联网的计算机能够访问软件仓库
  • 在未联网计算机中部署Archiver Appliance(以Rocky Linux 8系统为例)

    由于计算机未联网 xff0c 而利用 epicsarchiverap env 工具进行安装的过程中需要一些联网下载安装包的操作步骤 xff0c 因此以下会给出相应的解决方法 总体思路就是 xff1a 对于一般性网址如 GitHub 等 xf
  • CentOS 7 / Rocky Linux 8 / Windows 10 系统启动 Chrony/NTP 服务

    本文内容 背景介绍1 Chrony NTP 的联系与区别2 关于 Chrony NTP 服务端 客户端的概念3 Chrony 核心组件 CentOS 7 Rocky Linux 8 系统启动 Chrony 服务1 服务状态查询2 服务配置3
  • 前端基础知识——CSS

    CSS CSS 基于 HTML 中的父子元素思想 CSS 有很多类似 Word 的排版功能 xff08 颜色 字体 文字环绕等 xff09 的属性 相关语法说明 xff1a 基本语法 xff1a 选择器 span class token p
  • GitLab的使用

    简介 xff1a Git xff0c GitHub与GitLab有什么区别 xff1f 官方网站 xff1a https docs gitlab com ee topics git 常用命令和使用方式 xff1a 看完这篇还不会用Git x
  • Archiver Appliance 事务处理流程

    当 Archiver Appliance 开始运行后发生了什么 xff1a mgmt服务 xff1a config DefaultConfigService java span class token function initialize
  • Archiver Appliance 建立集群时可能出现的问题

    0 背景知识 AA 集群中的各个节点 xff0c 完全是分布式结构 xff0c 并不存在主从关系 各个节点共享完全相同的 xff1a PVTypeInfo 数据库表PV查询权限和结果 xff08 在某一节点上查询所有 PV xff0c 也能
  • 关于python的新特性函数注释(定义函数时使用“:”及“ ->”符号)

    刷题的时候发现有的题目函数定义格式类型是这样的 xff1a def lengthOfLongestSubstring self s str gt int 这种定义方式完全没明白啥意思 xff0c 于是经过一番查找 xff0c 大体意思如下
  • Rocky Linux 8 安装实时内核

    方法一 xff1a yum 安装 在 etc yum repos d 目录下新建一个Rocky8 rt repo安装rt内核和相关工具 span class token function sudo span yum span class t
  • ununtu docker

    移除老版本 Docker sudo apt get remove docker docker engine docker io containerd runc 1 Tips xff1a 如果第一步你这里报了如下错误 xff1a E Coul
  • 如何确认当前使用的.net 版本 及 C# .net VS 版本之间的对应关系

    如何确认当前使用的 net 版本 及 C net VS 版本之间的对应关系 方法1 打开此电脑 xff0c 在地址栏中输入 systemroot Microsoft Net Framework 现在看到的就是目前使用的 net 版本 方法2
  • nuxt 获取不到localStorage,使用cookie持久化

    nuxt项目中在store和plugins的js文件里使用localStorage会报错 解决方案 xff1a 1 安装 cookie universal nuxt span class token function npm span i
  • 数据库连接报错提示connection is being used

    数据库连接报错 xff1a connection is being used 解决办法 xff1a 1 在已经保存的连接上上编辑 xff0c 测试连接成功 xff0c 但是点击连接就会一直提示 connection is being use
  • VsCode中git路径的设置(window系统)

    VsCode中git路径的设置 xff08 window系统 xff09 首先电脑里已经安装好了git并已经把git添加到环境变量中去了 xff08 这有部分在之前的帖子中有讲过 xff09 找到你的电脑里的git路径 先找到你的git安装
  • Qt报错汇总

    1 DirectShowPlayerService doRender Unresolved error code 0x80040266 IDispatch error 102 使用Qt的MediaPlayer控件时报的错 原因 xff1a
  • ubuntu18.04 ros 安装 gazebo9

    三 Gazebo安装 如果前面安装ros 的时候安装了gazebo 这里进行卸载 xff08 1 xff09 sudo apt get remove gazebo xff08 2 xff09 sudo apt get remove libg
  • CMake 常用总结一:CMake 单个文件目录

    引言 CMake 实践帮助我们对 CMake 有一个系统全面的了解 xff0c 并且有大量示例以供参考 xff0c 至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake 阅读完 CMake 实践文档 xff0c 认为自己的任务