Linux下CMake使用介绍

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

        CMake是一个跨平台的编译自动配置工具,它使用一个名为CMakeLists.txt的文件来描述构建过程,可以产生标准的构建文件。它可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。

        CMake可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake支持in-place建构(二进档和源代码在同一个目录树中)和out-of-place建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake也支持静态与动态程式库的建构。CMake是一个比make更高级的编译配置工具。

        CMake的组态档取名为CMakeLists.txt。组态档是用一种建构软件专用的特殊编程语言写的CMake脚本。文件CMakeLists.txt需要手工编写,也可以通过编写脚本进行半自动的生成。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。

         CMake主要特点:(1)、开放源代码,使用类BSD许可发布;(2)、跨平台,并可生成native编译配置文件,在Linux/Unix平台,生成makefile;在苹果平台,可以生成xcode;在windows平台,可以生成msvc的工程文件;(3)、能够管理大型项目;(4)、简化编译构建过程和编译过程,CMake的工具链非常简单:cmake+make;(5)、高效率;(6)、可扩展,可以为cmake编写特定功能的模块,扩充cmake功能。

         查看Ubuntu14.0464位机上是否安装了CMake及版本号,可通过执行一下语句来验证:

$ cmake --version

        若没有安装,可执行以下语句进行安装:

$ apt-get install cmake

         CMakeLists.txt的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,参数和变量是大小写相关的,但,推荐全部使用大写指令。符号”#”后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格或分号进行间隔。变量使用${xxx}引用。

         常用命令说明:

1.      aux_source_directory(<dir><variable>) :该命令会把参数<dir>中所有的源文件(不包括头文件)名称赋值给参数<variable>;

2.      find_path(<VAR> name1[path1 path2 …]):该命令在参数path*指示的目录中查找文件name1并将查找到的路径保存在变量VAR中(其中使用”[…]”包含的项表示可忽略项,使用”…|…”分割的项表示只能选择其中一项);

3.      find_library(${var} NAMES name1[name2 …] PATHS path1 [path2 …] PATH_SUFFIXES suffix1 [uffix2 …]):搜索一个外部的链接库文件,并将结果的全部路径保存到var变量中。要搜索的链接库文件名字可能是name1,name2等;搜索路径为path1, path2等;此外还可以指定路径的后缀词为suffix1,suffix2等;

4.      find_package(name):在指定的模块目录中搜索一个名为Find<name>.cmake(例如,FindOSG.cmake)的CMake脚本模块文件,执行其中的内容,意图搜索到指定的外部依赖库头文件和库文件位置;

5.      find_program:搜索一个外部的可执行程序;

6.      project(name):指定项目名称name;

7.      include(file):在当前文件中包含另一个CMake脚本文件的内容,用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块;

8.      include_directories:指定头文件的搜索路径,用来向工程添加多个特定的头文件搜索路径,可以多次调用以设置多个路径,相当于指定gcc的-I参数;

9.      link_directories:添加非标准的共享库搜索路径,设置外部动态链接库或静态链接库的搜素路径,相当于gcc的-L参数;

10.  link_libraries:添加链接库;

11.  add_subdirectory:用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制文件存放的位置;

12.  add_executable:编译可执行程序,指定编译,好像也可以添加.o文件;

13.  add_definitions(-DMACRO1-DMACRO2 …):添加编译参数,添加-D预编译宏定义,可以一次添加多个;

14.  add_dependencies:定义target依赖的其它target,确保在编译本target之前,其它的target已经被构建;

15.  add_library:可以设置要生成的链接库为SHARED或者STATIC,还可以设置MODULE(插件,可动态调用,但不作为其它工程的依赖);

16.  add_custom_target(name COMMANDcmd1 [COMMAND cmd2 ..]):添加一个名为name的编译目录,并指定一个或多个自定义的命令cmd1,cmd2等;注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程;

17.  target_link_libraries:可以用来为target添加需要链接的共享库,指定工程所用的依赖库,添加链接库,添加动态库或静态库,相当于指定-l参数;

18.  message:打印消息,在控制台或者对话框输出一行或多行调试信息;

19.  set:定义一个用户自定义变量;

20.  set_target_properties:用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本;

21.  cmake_minimum_required:设定依赖的cmake版本;

22.  configure_file(infile outfile):将文件infile复制到outfile的位置,同时执行其中变量的自动配置和更替;

23.  install:安装目标工程到指定的文件夹,此命令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等;

24.  option(${var} “text” value):向用户提供一个可选项,提示信息为text,初始值为value,并将最终的结果传递到var变量中;

25.  enable_testing:用来控制Makefile是否构建test目标,涉及工程所有目录;

26.  exec_program:用于在指定的目录运行某个程序;

27. execute_process:执行一个或多个子进程,按指定的先后顺序运行一个或多个命令;

28.  file:文件操作命令;

  内置变量、环境变量:

1.      CMAKE_C_COMPILER:指定C编译器;

2.      CMAKE_CXX_COMPILER:指定C++编译器;

3.      CMAKE_C_FLAGS:指定编译C文件时的编译选项,如-g,也可以通过add_definitions添加编译选项;

4.      CMAKE_CXX_FLAGS:设置C++编译选项;

5.      CMAKE_BUILD_TYPE:build类型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug;

6.      CMAKE_COMMAND:也就是CMake可执行文件本身的全路径;

7.      CMAKE_DEBUG_POSTFIX:Debug版本生成目标的后缀,通常可以设置为”d”字符;

8.      CMAKE_GENERATOR:编译器名称,例如”UnixMakefiles”, “Visual Studio 7”等;

9.      CMAKE_INSTALL_PREFIX:工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,Unix/Linux下默认为/usr/local, windows下默认为C:\Program Files;

10.  CMAKE_MODULE_PATH:设置搜索CMakeModules模块(.cmake)的额外路径,用来定义自己的cmake模块所在的路径;

11.  CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的CMakeLists.txt所在的路径;

12.  CMAKE_CURRENT_BINARY_DIR:如果是in-source编译,则跟CMAKE_CURRENT_SOURCE_DIR一致;如果是out-of-source,指的是target编译目录;

13.  CMAKE_CURRENT_LIST_FILE:输出调用这个变量的CMakeLists.txt的完整路径;

14.  CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行;

15.  CMAKE_INCLUDE_CURRENT_DIR:自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt;

16.  CMAKE_INCLUDE_DIRECTORIES_PROJECT_EFORE:将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确定跟系统发生冲突时可以提供一些帮助;

17.  EXECUTABLE_OUTPUT_PATH:指定可执行文件的存放路径,最终结果的存放目录;

18.  LIBRARY_OUTPUT_PATH:指定库文件存放路径,最终结果的存放目录;

19.  BUILD_SHARED_LIBS:指定编译成静态库还是动态库;

20.  PROJECT_BINARY_DIR(CMAKE_BINARY_DIR):如果是内部构建(in-sourcebuild),指的就是工程顶层目录;如果是外部构建(out-of-source build),指的是工程编译发生的目录;

21.  PROJECT_NAME:工程名称,即使用PROJECT命令设置的名称;

22.  PROJECT_SOURCE_DIR(CMAKE_SOURCE_DIR):工程源代码文件所在的目录,指的是工程顶层目录;

23.  CYGWIN:标识当前系统是否为Cygwin;

24.  MSVC:标识当前系统是否使用MicrosoftVisual C;

25.  UNIX:标识当前系统是否为Unix系列(包括Linux、Cygwin和Apple);

26.  WIN32:标识当前系统是否为Windows及Win64;

  内置变量的使用:

1.      在CMakeLists.txt中指定,使用set;

2.      cmake命令中使用,如cmake-DBUILD_SHARED_LIBS=OFF;

 CMake调用环境变量的方式:使用$ENV{NAME}指令就可以调用系统的环境变量了。如MESSAGE(STATUS “HOME dir: $ENV {HOME}”)

         设置环境变量的方式是:SET(ENV{变量名} 值)

 变量,以${MY_VAIRABLE}的形式表达,其储存类型为字符串类型,但是可以根据具体命令的要求自动转换成布尔型、整型或者浮点类型。变量可以出现在字符串中,也可以实现”内省”。变量有用户自定义和系统内置两种,用户自定义变量使用SET命令设置;而系统变量由系统自动赋值,例如${PROJECT_SOURCE_DIR}。

 CMake中的条件语句:IF(expression)… ELSE(expression) … ENDIF(expression) 或者IF(expression1) …ELSEIF(expression2) … ELSE() … ENDIF() ,expression是判断条件,和C/C++类似,CMake的条件也存在”与/或/非”以及”等于/大于/小于”等几种操作符,分别用AND/OR/NOT以及EQUAL/LESS/GREATER来表示。IF控制语句,变量是直接使用变量名引用,而不需要${}.

         CMake中的循环语句:FOREACH(vararg1 arg2 …) … ENDFOREACH(var) ,设置一个循环的局部变量var,每次将其赋为arg1, arg2等变量(或者变量数组)中的一个值,并执行循环中的命令段。

         CMake中的宏函数可以理解为C语言的函数,它改变代码执行跳转的流程并简化了脚本程序的开发:MACRO(funcname [arg1 [arg2 …]]) … ENDMACRO(funcname) ,和函数的编写要求一样,CMake的宏函数必须制定一个函数名funcname,以及零个或多个输入参数arg1,arg2等。需要调用宏函数的时候,只要直接使用funcname(arg1 arg2)的形式就可以了。

         CMake第一次运行的时候,它将产生一个文件叫CMakeCache.txt,该文件可以被看作一个配置文件,它里面的内容就像传递给configure命令的参数集。

 以下举例来说明CMake的详细用法:

 总的目录结构为:

  

各个文件的内容为:

1.1 make_api.sh

#!/bin/bashset -ePROJ_ROOT=$PWDBUILD_ROOT=$PROJ_ROOTecho "build root: $BUILD_ROOT"if [ "$1" == "--no-test" ]; then NO_TEST=1else NO_TEST=0fi#mkdir的-p选项允许一次创建多层次的目录,而不是一次只创建单独的目录mkdir -p $BUILD_ROOT/buildcd $BUILD_ROOT/buildcmake -DCMAKE_CXX_FLAGS=-g -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX:PATH=$BUILD_ROOT/install $PROJ_ROOTmake -j5make install > /dev/nullmkdir -p $BUILD_ROOT/api/buildcd $BUILD_ROOT/api/buildcmake -DCMAKE_BUILD_TYPE=Release -DNO_TESTBENCH=$NO_TEST \ -DSDK_INSTALL_PATH=$BUILD_ROOT/install \ -DCMAKE_INSTALL_PREFIX:PATH=$PROJ_ROOT/api_install $PROJ_ROOT/apimake -j5make install > /dev/null

1.2 CMakeLists.txt

#/cmake/CMakeLists.txtPROJECT(math_sdk)CMAKE_MINIMUM_REQUIRED(VERSION 2.8)MESSAGE("start build")ADD_SUBDIRECTORY(add_sub)ADD_SUBDIRECTORY(mul_div)
1.3 add_sub

1.3.1 CMakeLists.txt

#/cmake/add_subADD_SUBDIRECTORY(add)ADD_SUBDIRECTORY(sub)#目录的安装#INSTALL(DIRECTORY ./add/src/# DESTINATION include/add/# FILES_MATCHING  PATTERN "*.h" # )#INSTALL(DIRECTORY ./sub/src/# DESTINATION include/sub/# FILES_MATCHING PATTERN "*.h"# )
1.3.2 add

1.3.2.1 src

1.3.2.1.1 addOper.cpp

#include "addOper.h"int calAdd(int a, int b)return (a + b);}
1.3.2.1.2 addOper.h
#ifndef _ADD_OPER_H_#define _ADD_OPER_H_int calAdd(int a, int b);#endif

1.3.2.2 CMakeLists.txt

#/cmake/add_sub/addAUX_SOURCE_DIRECTORY(./src ADD_SRC_LIST)ADD_LIBRARY(add_oper STATIC ${ADD_SRC_LIST} )INSTALL(DIRECTORY ./src/ DESTINATION include/add_sub/add FILES_MATCHING PATTERN "*.h" )INSTALL(TARGETS add_oper DESTINATION lib )
1.3.3 sub

1.3.3.1 src

1.3.3.1.1 subOper.cpp

#include "subOper.h"int calSub(int a, int b)return (a - b);}
1.3.3.1.2 subOper.h
#ifndef _SUB_OPER_H_#define _SUB_OPER_H_int calSub(int a, int b);#endif

1.3.3.2 CMakeLists.txt

#/cmake/add_sub_subAUX_SOURCE_DIRECTORY(./src SUB_SRC_LIST)ADD_LIBRARY(sub_oper STATIC ${SUB_SRC_LIST} )INSTALL(DIRECTORY ./src/ DESTINATION include/add_sub/sub FILES_MATCHING PATTERN "*.h" )INSTALL(TARGETS sub_oper DESTINATION lib )
1.4 api

1.4.1 include

1.4.1.1 mathOper.h

#ifndef _MATH_OPER_H_#define _MATH_OPER_H_int calAddSub(int a, int b);int calMulDiv(int a, int b);#endif

1.4.2 sdk

1.4.2.1 CMakeLists.txt

#/cmake/api/sdkAUX_SOURCE_DIRECTORY(. SDK_SRC_LIST)INCLUDE_DIRECTORIES(${SDK_INSTALL_PATH}/include/add_sub)INCLUDE_DIRECTORIES(${SDK_INSTALL_PATH}/include/mul_div)ADD_LIBRARY(mathsdk SHARED ${SDK_SRC_LIST})SET(DEP_LIBS ${SDK_INSTALL_PATH}/lib/libadd_oper.a ${SDK_INSTALL_PATH}/lib/libsub_oper.a ${SDK_INSTALL_PATH}/lib/libmul_oper.a ${SDK_INSTALL_PATH}/lib/libdiv_oper.a )TARGET_LINK_LIBRARIES(mathsdk ${DEP_LIBS})INSTALL(TARGETS mathsdk DESTINATION lib )
1.4.2.2 mathOper.cpp
#include "mathOper.h"#include "add/addOper.h"#include "sub/subOper.h"#include "mul/mulOper.h"#include "div/divOper.h"int calAddSub(int a, int b){  int c = 0, d = 0; c = calAdd(a, b); d = calSub(a, b); return (c + d);}int calMulDiv(int a, int b)int c = 0, d = 0; c = calMul(a, b); d = calDiv(a, b); return (c - d);}
1.4.3 test

1.4.3.1 CMakeLists.txt

#/cmake/api/testAUX_SOURCE_DIRECTORY(. TEST_SRC_LIST)INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include)ADD_EXECUTABLE(test ${TEST_SRC_LIST})SET(DEP_LIB ${CMAKE_INSTALL_PREFIX}/lib/libmathsdk.so)TARGET_LINK_LIBRARIES(test ${DEP_LIB})INSTALL(TARGETS test DESTINATION bin )
1.4.3.2 demo.cpp
#include "mathOper.h"#include <iostream>int main(){ int a = 10, b = 2; int c = calAddSub(a, b); int d = calMulDiv(a, b); std::cout<<"c = "<<c<<std::endl;//c = 20 std::cout<<"d = "<<d<<std::endl;//d = 15 return 0;}

1.4.4 CMakeLists.txt

#/cmake/apiPROJECT(math_api)CMAKE_MINIMUM_REQUIRED(VERSION 2.8)MESSAGE("==============start build api==============")SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -z defs -pthread")INCLUDE_DIRECTORIES(${SDK_INSTALL_PATH}/include/add_sub)INCLUDE_DIRECTORIES(${SDK_INSTALL_PATH}/include/mul_div)LINK_DIRECTORIES(${SDK_INSTALL_PATH}/lib)INCLUDE_DIRECTORIES(include)ADD_SUBDIRECTORY(sdk)if(NOT NO_TESTBENCH)ADD_SUBDIRECTORY(test)endif()INSTALL(DIRECTORY ./include/ DESTINATION include )
1.5 mul_div

1.5.1 div

1.5.1.1 src

1.5.1.1.1 divOper.cpp

#include "divOper.h"int calDiv(int a, int b)return (a / b);}
1.5.1.1.2 divOper.h
#ifndef _DIV_OPER_H_#define _DIV_OPER_H_int calDiv(int a, int b);#endif

1.5.1.2 CMakeLists.txt

#/cmake/mul_div/divAUX_SOURCE_DIRECTORY(./src DIV_SRC_LIST)ADD_LIBRARY(div_oper STATIC ${DIV_SRC_LIST} )INSTALL(DIRECTORY ./src/ DESTINATION include/mul_div/div FILES_MATCHING PATTERN "*.h" )INSTALL(TARGETS div_oper DESTINATION lib )
1.5.2 mul

1.5.2.1 src

1.5.2.1.1 mulOper.cpp

#include "mulOper.h"int calMul(int a, int b)return (a * b);}
1.5.2.1.2 mulOper.h
#ifndef _MUL_OPER_H_#define _MUL_OPER_H_int calMul(int a, int b);#endif

1.5.2.2 CMakeLists.txt

#/cmake/mul_div/mulAUX_SOURCE_DIRECTORY(./src MUL_SRC_LIST)ADD_LIBRARY(mul_oper STATIC ${MUL_SRC_LIST} )INSTALL(DIRECTORY ./src/ DESTINATION include/mul_div/mul FILES_MATCHING PATTERN "*.h" )INSTALL(TARGETS mul_oper DESTINATION lib )

1.5.3 CMakeLists.txt

#/cmake/mul_divADD_SUBDIRECTORY(mul)ADD_SUBDIRECTORY(div)

依次执行:

$ bash ./make_api.sh --no-test$ bash ./make_api.shexport LD_LIBRARY_PATH=api_install/lib$ ./api_install/bin/test
GitHubhttps://github.com/fengbingchun/Linux_Code_Test


参考文献:

1.      http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

2.      http://blog.chinaunix.net/uid-28458801-id-3501768.html

3.      http://www.hahack.com/codes/cmake/            

4.      http://www.cnblogs.com/rickyk/p/3877238.html?utm_source=tuicool

5.      http://www.docin.com/p-728984407.html

6.      http://www.doc88.com/p-7485437070242.html

7.      http://www.cmake.org/cmake/help/v3.3/index.html

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

Γ ( z ) = 0 t z 1 e t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

猜你喜欢

转载自blog.csdn.net/hddryjv/article/details/83924535