-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
39 lines (21 loc) · 137 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>NeXT's Blog</title>
<link href="http://github.com/atom.xml" rel="self"/>
<link href="http://github.com/"/>
<updated>2022-12-06T11:39:45.611Z</updated>
<id>http://github.com/</id>
<author>
<name>NeXT</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>tools_usage</title>
<link href="http://github.com/2022/12/06/tools_usage/"/>
<id>http://github.com/2022/12/06/tools_usage/</id>
<published>2022-12-06T11:23:19.000Z</published>
<updated>2022-12-06T11:39:45.611Z</updated>
<content type="html"><![CDATA[<h1 id="GCC编译器"><a href="#GCC编译器" class="headerlink" title="GCC编译器"></a>GCC编译器</h1><h2 id="1-cpp文件编译过程"><a href="#1-cpp文件编译过程" class="headerlink" title="1 cpp文件编译过程"></a>1 cpp文件编译过程</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">1 预处理-Pre-Processing //.i文件</span><br><span class="line"> <span class="comment"># -E 选项指示编译器仅对输入文件进行预处理</span></span><br><span class="line"> g++ -E test.cpp -o test.i </span><br><span class="line"></span><br><span class="line">2 编译-Compiling // .s文件</span><br><span class="line"> <span class="comment"># -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译</span></span><br><span class="line"> <span class="comment"># g++ 产生的汇编语言文件的缺省扩展名是 .s </span></span><br><span class="line"> g++ -S test.i -o test.s</span><br><span class="line"></span><br><span class="line">3 汇编-Assembling // .o文件</span><br><span class="line"> <span class="comment"># -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码</span></span><br><span class="line"> <span class="comment"># 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。</span></span><br><span class="line"> g++ -c test.s -o test.o</span><br><span class="line"></span><br><span class="line">4 链接-Linking // bin文件</span><br><span class="line"> <span class="comment"># -o 编译选项来为将产生的可执行文件用指定的文件名</span></span><br><span class="line"> g++ test.o -o <span class="built_in">test</span></span><br></pre></td></tr></table></figure><h2 id="2-g-重要编译参数"><a href="#2-g-重要编译参数" class="headerlink" title="2 g++重要编译参数"></a>2 g++重要编译参数</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line">1-g编译带调试信息的可执行文件</span><br><span class="line"> <span class="comment"># -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 产生带调试信息的可执行文件test</span></span><br><span class="line"> g++ -g test.cpp</span><br><span class="line"></span><br><span class="line">2-O[n]优化源代码</span><br><span class="line"> <span class="comment">## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># -O 选项告诉g++对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2 选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为0–3)</span></span><br><span class="line"> <span class="comment"># -O 同时减小代码的长度和执行时间,其效果等价于-O1</span></span><br><span class="line"> <span class="comment"># -O0 表示不做优化</span></span><br><span class="line"> <span class="comment"># -O1 为默认优化</span></span><br><span class="line"> <span class="comment"># -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。</span></span><br><span class="line"> <span class="comment"># -O3 则包括循环展开和其他一些与处理特性相关的优化工作。</span></span><br><span class="line"> <span class="comment"># 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 使用 -O2优化源代码,并输出可执行文件</span></span><br><span class="line"> g++ -O2 test.cpp</span><br><span class="line"> </span><br><span class="line">3-l 和 -L指定库文件 | 指定库文件路径</span><br><span class="line"> <span class="comment"># -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名</span></span><br><span class="line"> <span class="comment"># 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 链接glog库</span></span><br><span class="line"> g++ -lglog test.cpp</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录</span></span><br><span class="line"> <span class="comment"># -L参数跟着的是库文件所在的目录名</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下</span></span><br><span class="line"> g++ -L/home/bing/mytestlibfolder -lmytest test.cpp</span><br><span class="line"> </span><br><span class="line">4-I指定头文件搜索目录</span><br><span class="line"> <span class="comment"># -I </span></span><br><span class="line"> <span class="comment"># /usr/include目录一般不用指定,gcc知道去那里找,但是如果头文件不在/usr/icnclude里我们就要用-I参数指定了,</span></span><br><span class="line"> <span class="comment"># 比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。</span></span><br><span class="line"> <span class="comment">#-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。</span></span><br><span class="line"></span><br><span class="line"> g++ -I/myinclude test.cpp</span><br><span class="line"> </span><br><span class="line">5-Wall打印警告信息</span><br><span class="line"><span class="comment"># 打印出gcc提供的警告信息(例如:变量定义了未使用,初始化列表的顺序跟定义的成员变量顺序不一致等等)</span></span><br><span class="line">g++ -Wall test.cpp</span><br><span class="line"></span><br><span class="line">6-w关闭警告信息</span><br><span class="line"><span class="comment"># 关闭所有警告信息</span></span><br><span class="line">g++ -w test.cpp</span><br><span class="line"></span><br><span class="line">7-std=c++11设置编译标准</span><br><span class="line"> <span class="comment"># 使用 c++11 标准编译 test.cpp</span></span><br><span class="line"> g++ -std=c++11 test.cpp</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">8-o指定输出文件名</span><br><span class="line"> <span class="comment"># 指定即将产生的文件名</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 指定输出可执行文件名为test</span></span><br><span class="line"> g++ test.cpp -o <span class="built_in">test</span></span><br><span class="line"> </span><br><span class="line">9-D定义宏</span><br><span class="line"> <span class="comment"># 在使用gcc/g++编译的时候定义宏</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 常用场景:</span></span><br><span class="line"> <span class="comment"># -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG</span></span><br><span class="line"> 例子:</span><br><span class="line"> // -Dname 定义宏name,默认定义内容为字符串“1”</span><br><span class="line"> <span class="comment">#include <stdio.h></span></span><br><span class="line"></span><br><span class="line"> int <span class="function"><span class="title">main</span></span>()</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">#ifdef DEBUG</span></span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"DEBUG LOG\n"</span>);</span><br><span class="line"> <span class="comment">#endif</span></span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"in\n"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 1. 在编译的时候,使用gcc -DDEBUG main.cpp</span><br><span class="line"> // 2. ifdef代码可以被执行</span><br><span class="line"> </span><br><span class="line">10 -fprofile-arcs -ftest-coverage 代码覆盖率</span><br><span class="line"><span class="comment">#gcc需要静态注入目标程序编译选项,在编译链接的时候加入2个选项(-ftest-coverage -fprofile-arcs ),编译结束之后会生成 .gcno 文件,而经过静态注入的目标程序在“正常结束”后,会在运行目录下产生.gcda数据文件,通过gcov工具就可产生覆盖率数据结果</span></span><br><span class="line"></span><br><span class="line">g++ -fprofile-arcs -ftest-coverage hello.c -o hello</span><br><span class="line"><span class="comment">#将出现 hello 和 hello.gcno 两个文件</span></span><br><span class="line"></span><br><span class="line">./hello </span><br><span class="line"><span class="comment">#将出现 hello.gcda 文件</span></span><br><span class="line"></span><br><span class="line">gcov hello.c</span><br><span class="line"><span class="comment">#将显示下面的结果</span></span><br><span class="line">File <span class="string">'hello.c'</span></span><br><span class="line">Lines executed:57.14% of 7</span><br><span class="line">Creating <span class="string">'hello.c.gcov'</span></span><br><span class="line">上述57.14%为覆盖率,指的是每一行被覆盖到的次数</span><br></pre></td></tr></table></figure><hr><h1 id="GDB调试器"><a href="#GDB调试器" class="headerlink" title="GDB调试器"></a>GDB调试器</h1><h2 id="1-使用"><a href="#1-使用" class="headerlink" title="1 使用"></a>1 使用</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## 以下命令后括号内为命令的简化使用,比如run(r),直接输入命令 r 就代表命令run</span></span><br><span class="line">$(gdb)<span class="built_in">help</span>(h) <span class="comment"># 查看命令帮助,具体命令查询在gdb中输入help + 命令 </span></span><br><span class="line"></span><br><span class="line">$(gdb)run(r) <span class="comment"># 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)</span></span><br><span class="line"></span><br><span class="line">$(gdb)start <span class="comment"># 单步执行,运行程序,停在第一行执行语句</span></span><br><span class="line"></span><br><span class="line">$(gdb)list(l) <span class="comment"># 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数)</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">set</span> <span class="comment"># 设置变量的值</span></span><br><span class="line"></span><br><span class="line">$(gdb)next(n) <span class="comment"># 单步调试(逐过程,函数直接执行)</span></span><br><span class="line"></span><br><span class="line">$(gdb)step(s) <span class="comment"># 单步调试(逐语句:跳入自定义函数内部执行)</span></span><br><span class="line"></span><br><span class="line">$(gdb)backtrace(bt) <span class="comment"># 查看函数的调用的栈帧和层级关系</span></span><br><span class="line"></span><br><span class="line">$(gdb)frame(f) <span class="comment"># 切换函数的栈帧</span></span><br><span class="line"></span><br><span class="line">$(gdb)info(i) <span class="comment"># 查看函数内部局部变量的数值</span></span><br><span class="line"></span><br><span class="line">$(gdb)finish <span class="comment"># 结束当前函数,返回到函数调用点</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">continue</span>(c) <span class="comment"># 继续运行</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">print</span>(p) <span class="comment"># 打印值及地址</span></span><br><span class="line"></span><br><span class="line">$(gdb)quit(q) <span class="comment"># 退出gdb</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">break</span>+num(b) <span class="comment"># 在第num行设置断点</span></span><br><span class="line"></span><br><span class="line">$(gdb)info breakpoints <span class="comment"># 查看当前设置的所有断点</span></span><br><span class="line"></span><br><span class="line">$(gdb)delete breakpoints num(d) <span class="comment"># 删除第num个断点</span></span><br><span class="line"></span><br><span class="line">$(gdb)display <span class="comment"># 追踪查看具体变量值</span></span><br><span class="line"></span><br><span class="line">$(gdb)undisplay <span class="comment"># 取消追踪观察变量</span></span><br><span class="line"></span><br><span class="line">$(gdb)watch <span class="comment"># 被设置观察点的变量发生修改时,打印显示</span></span><br><span class="line"></span><br><span class="line">$(gdb)i watch <span class="comment"># 显示观察点</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">enable</span> breakpoints <span class="comment"># 启用断点</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">disable</span> breakpoints <span class="comment"># 禁用断点</span></span><br><span class="line"></span><br><span class="line">$(gdb)x <span class="comment"># 查看内存x/20xw 显示20个单元,16进制,4字节每单元</span></span><br><span class="line"></span><br><span class="line">$(gdb)run argv[1] argv[2] <span class="comment"># 调试时命令行传参</span></span><br><span class="line"></span><br><span class="line">$(gdb)<span class="built_in">set</span> follow-fork-mode child <span class="comment"># Makefile项目管理:选择跟踪父子进程(fork())</span></span><br></pre></td></tr></table></figure><blockquote><p>Tips:</p><p>1.编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main</p><p>2.回车键:重复上一命令</p></blockquote><hr><h1 id="CMake"><a href="#CMake" class="headerlink" title="CMake"></a>CMake</h1><h2 id="1-语法特性"><a href="#1-语法特性" class="headerlink" title="1 语法特性"></a>1 语法特性</h2><ul><li><p><strong>基本语法格式</strong></p><ul><li>参数之间使用<strong>空格</strong>或<strong>分号</strong>分开</li></ul></li><li><p><strong>指令是大小写无关的,参数和变量是与大小写有关</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span>(HELLO hello.cpp)</span><br><span class="line">add_executable(hello main.cpp hello.cpp)</span><br><span class="line">ADD_EXECUTABLE(hello main.cpp <span class="variable">${HELLO}</span>) <span class="comment">#HELLO与set建立的HELLO大小写要一致</span></span><br></pre></td></tr></table></figure></li><li><p><strong>变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名</strong></p></li></ul><h2 id="2-重要指令和CMake常用变量"><a href="#2-重要指令和CMake常用变量" class="headerlink" title="2 重要指令和CMake常用变量"></a>2 重要指令和CMake常用变量</h2><h3 id="2-1-重要指令"><a href="#2-1-重要指令" class="headerlink" title="2.1 重要指令"></a>2.1 重要指令</h3><ul><li><p><strong>cmake_minimum_required</strong> <strong>- 指定CMake的最小版本要求</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CMake最小版本要求为2.8.3</span></span><br><span class="line">cmake_minimum_required(VERSION 2.8.3)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])</strong></li></ul></li><li><p><strong>project</strong> <strong>- 定义工程名称,并可指定工程支持的语言</strong> </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 指定工程名为HELLOWORLD</span></span><br><span class="line">project(HELLOWORLD)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>project(projectname [CXX] [C] [Java])</strong></li></ul></li><li><p><strong>set</strong> <strong>- 显式的定义变量</strong> </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义SRC变量,其值为main.cpp hello.cpp</span></span><br><span class="line"><span class="built_in">set</span>(SRC sayhello.cpp hello.cpp)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])</strong></li></ul></li><li><p><strong>include_directories - 向工程添加多个特定的头文件搜索路径</strong> —>相当于指定g++编译器的-I参数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径</span></span><br><span class="line">include_directories(/usr/include/myincludefolder ./include)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)</strong></li></ul></li><li><p><strong>link_directories</strong> <strong>- 向工程添加多个特定的库文件搜索路径</strong> —>相当于指定g++编译器的-L参数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径</span></span><br><span class="line">link_directories(/usr/lib/mylibfolder ./lib)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:link_directories(dir1 dir2 …)</li></ul></li><li><p><strong>add_library</strong> <strong>- 生成库文件</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 通过变量 SRC 生成 libhello.so 共享库</span></span><br><span class="line"><span class="comment"># SHARED生成动态库、STATIC生成静态库</span></span><br><span class="line">add_library(hello SHARED <span class="variable">${SRC}</span>)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)</strong></li></ul></li><li><p><strong>add_compile_options</strong> - 添加编译参数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加编译参数 -Wall -std=c++11</span></span><br><span class="line">add_compile_options(-Wall -std=c++11 -O2)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>add_compile_options()</strong></li></ul></li><li><p><strong>add_executable</strong> <strong>- 生成可执行文件</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编译main.cpp生成可执行文件main</span></span><br><span class="line">add_executable(main main.cpp)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>add_library(exename source1 source2 … sourceN)</strong></li></ul></li><li><p><strong>target_link_libraries</strong> - 为 target 添加需要链接的共享库 —>相同于指定g++编译器-l参数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将hello动态库文件链接到可执行文件main</span></span><br><span class="line">target_link_libraries(main hello) <span class="comment">#可以写成libhello.so 或者直接用 hello</span></span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>target_link_libraries(target library1library2…)</strong></li></ul></li><li><p><strong>add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加src子目录,src中需有一个CMakeLists.txt</span></span><br><span class="line">add_subdirectory(src)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])</strong></li></ul></li><li><p><strong>aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义SRC变量,其值为当前目录下所有的源代码文件</span></span><br><span class="line">aux_source_directory(. SRC)</span><br><span class="line"><span class="comment"># 编译SRC变量所代表的源代码文件,生成main可执行文件</span></span><br><span class="line">add_executable(main <span class="variable">${SRC}</span>)</span><br></pre></td></tr></table></figure></li><li><ul><li>语法:<strong>aux_source_directory(dir VARIABLE)</strong></li></ul></li></ul><h3 id="2-2-CMake重用变量"><a href="#2-2-CMake重用变量" class="headerlink" title="2.2 CMake重用变量"></a>2.2 CMake重用变量</h3><ul><li><p><strong>CMAKE_C_FLAGS gcc编译选项</strong></p><p><strong>CMAKE_CXX_FLAGS g++编译选项</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_CXX_FLAGS <span class="string">"<span class="variable">${CMAKE_CXX_FLAGS}</span> -std=c++11"</span>)</span><br></pre></td></tr></table></figure><p><strong>CMAKE_BUILD_TYPE 编译类型(Debug, Release)</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设定编译类型为debug,调试时需要选择debug</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_BUILD_TYPE Debug) </span><br><span class="line"><span class="comment"># 设定编译类型为release,发布时需要选择release</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_BUILD_TYPE Release) </span><br></pre></td></tr></table></figure><p><strong>CMAKE_BINARY_DIR</strong></p><p><strong>PROJECT_BINARY_DIR</strong></p><p><strong><projectname>__BINARY_DIR</strong></p></li><li><ol><li>这三个变量指代的内容是一致的。</li><li>如果是 in source build,指的就是工程顶层目录。</li><li>如果是 out-of-source 编译,指的是工程编译发生的目录。</li><li>PROJECT_BINARY_DIR 运行<code>cmake</code>命令的目录,即工程编译发生的路径。</li></ol></li><li><p><strong>CMAKE_SOURCE_DIR</strong></p><p><strong>PROJECT_SOURCE_DIR</strong><br><strong><projectname>__SOURCE_DIR</strong></p></li><li><ol><li>这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。</li><li>也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致。</li><li>PROJECT_SOURCE_DIR 最近一个<code>CMakeLists.txt</code>文件所在的文件夹路径。。</li></ol></li></ul><hr><ul><li><p><strong>CMAKE_C_COMPILER:指定C编译器</strong></p></li><li><p><strong>CMAKE_CXX_COMPILER:指定C++编译器</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span>(CMAKE_CXX_COMPLIER 14)</span><br></pre></td></tr></table></figure></li><li><p><strong>EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#指定可执行文件的输出目录,输出到bin下面 </span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_RUNTIME_OUTPUT_DIRECTORY <span class="variable">${PROJECT_SOURCE_DIR}</span>/bin)</span><br></pre></td></tr></table></figure></li><li><p><strong>CMAKE_LIBRARY_OUTPUT_DIRECTORY:库文件输出的存放路径</strong></p></li></ul><blockquote><p>Tips:</p><p>EXECUTABLE_OUTPUT_PATH/LIBRARY_OUTPUT_PATH</p><p>上述两个参数已经被CMAKE_RUNTIME_OUTPUT_DIRECTORY<code>和</code>CMAKE_LIBRARY_OUTPUT_DIRECTORY替代</p></blockquote><h2 id="3-CMake编译工程"><a href="#3-CMake编译工程" class="headerlink" title="3 CMake编译工程"></a>3 CMake编译工程</h2><p>CMake目录结构:项目主目录存在一个CMakeLists.txt文件</p><p><strong>两种方式设置编译规则</strong>:</p><ol><li>包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可;</li><li>包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中;</li></ol><h2 id="4-sample"><a href="#4-sample" class="headerlink" title="4 sample"></a>4 sample</h2><p>源码在routing_planning/学习笔记/cmake_test_file下</p><ul><li><p><strong>目录结构</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">next@pc:~/routing_planning/学习笔记/cmake_test_file$ tree .</span><br><span class="line">.</span><br><span class="line">├── bin</span><br><span class="line">├── build</span><br><span class="line">├── CMakeLists.txt</span><br><span class="line">├── include</span><br><span class="line">│ ├── Gun.hpp</span><br><span class="line">│ └── solider.hpp</span><br><span class="line">├── lib</span><br><span class="line">├── math</span><br><span class="line">│ ├── CMakeLists.txt</span><br><span class="line">│ ├── myMath.cpp</span><br><span class="line">│ └── myMath.hpp</span><br><span class="line">├── pc_complies.sh</span><br><span class="line">└── src</span><br><span class="line"> ├── Gun.cpp</span><br><span class="line"> ├── main.cpp</span><br><span class="line"> └── solider.cpp</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="comment">#在math中添加了一个计算前n项计算方法</span></span><br><span class="line"><span class="comment">#pc_complies.sh为编写的自动编译的脚本</span></span><br></pre></td></tr></table></figure></li><li><p><strong>子目录的CMakeLists.txt</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">aux_source_directory(. DIR_LIB_SRCS)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成链接库,默认生成的是静态库</span></span><br><span class="line"><span class="comment"># STATIC生成静态库、SHARED生成动态库或共享库</span></span><br><span class="line">add_library(MathFunctions_so SHARED <span class="variable">${DIR_LIB_SRCS}</span>)</span><br><span class="line">add_library(MathFunctions_o STATIC <span class="variable">${DIR_LIB_SRCS}</span>)</span><br></pre></td></tr></table></figure></li><li><p><strong>主目录CMakeLists.txt</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">cmake_minimum_required(VERSION 3.0.0)</span><br><span class="line">project(CMAKE_TEST VERSION 0.1.0)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置CMAKE编译选项 c++14标准、o2优化、显示warning</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_CXX_FLAGS <span class="string">"<span class="variable">${CMAKE_CXX_FLAGS}</span> -std=c++14 -Wall"</span>)</span><br><span class="line"><span class="comment"># 设置c++版本</span></span><br><span class="line"><span class="comment"># set(CMAKE_CXX_STANDARD 14)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置编译版本 bebug / relese</span></span><br><span class="line">SET(CMAKE_BUILD_TYPE Debug)</span><br><span class="line"><span class="comment"># SET(CMAKE_BUILD_TYPE Release)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),</span></span><br><span class="line"><span class="comment"># 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,</span></span><br><span class="line"><span class="comment"># 都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。</span></span><br><span class="line"><span class="comment"># add_compile_options(-fPIC)</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_POSITION_INDEPENDENT_CODE ON) <span class="comment">#与上面被注释的作用相同,下面这种比较标准</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#设置可执行文件输出路径 注意要放在靠前的位置提前设置</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_RUNTIME_OUTPUT_DIRECTORY <span class="variable">${PROJECT_SOURCE_DIR}</span>/bin)</span><br><span class="line"><span class="comment"># 设置静态链接库输出路径</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_LIBRARY_OUTPUT_DIRECTORY <span class="variable">${PROJECT_SOURCE_DIR}</span>/lib)</span><br><span class="line"><span class="comment"># 设置动态链接库输出路径</span></span><br><span class="line"><span class="built_in">set</span>(CMAKE_ARCHIVE_OUTPUT_DIRECTORY <span class="variable">${PROJECT_SOURCE_DIR}</span>/lib)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加math子目录,注意子文件要放在总CMakeLists.txt的上面,不然链接不到</span></span><br><span class="line">add_subdirectory(math)</span><br><span class="line"></span><br><span class="line"><span class="comment"># include_directories 设置包含的目录</span></span><br><span class="line"><span class="comment"># PROJECT_SOURCE_DIR 工程的根目录</span></span><br><span class="line">include_directories(</span><br><span class="line"> <span class="variable">${PROJECT_SOURCE_DIR}</span>/include</span><br><span class="line"> <span class="variable">${PROJECT_SOURCE_DIR}</span>/math</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># aux_source_directory 搜索所有的cpp文件</span></span><br><span class="line"><span class="comment"># 在当前src目录下搜索所有的cpp文件,并储存在变量DIR_SRCS中</span></span><br><span class="line">aux_source_directory(./src DIR_SRCS)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编译可执行文件</span></span><br><span class="line">add_executable(CMAKE_TEST <span class="variable">${DIR_SRCS}</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定链接动态库或静态库 </span></span><br><span class="line">target_link_libraries(CMAKE_TEST MathFunctions_so) <span class="comment">#在math中生成的链接库</span></span><br><span class="line"><span class="comment"># target_link_libraries(CMAKE_TEST ${PROJECT_SOURCE_DIR}/lib/libMathFunctions.so)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定工程需要用到的一些库</span></span><br><span class="line"><span class="comment">#find_package(PkgConfig)</span></span><br><span class="line"><span class="comment">#添加需要链接的库文件目录</span></span><br><span class="line"><span class="comment"># link_directories(</span></span><br><span class="line"><span class="comment"># /usr/lib64/</span></span><br><span class="line"><span class="comment"># ${GTK_LIBRARY_DIRS}</span></span><br><span class="line"><span class="comment"># )</span></span><br></pre></td></tr></table></figure></li></ul><hr><h1 id="GoogleTest"><a href="#GoogleTest" class="headerlink" title="GoogleTest"></a>GoogleTest</h1><h2 id="1-源码编译安装"><a href="#1-源码编译安装" class="headerlink" title="1 源码编译安装"></a>1 源码编译安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">1.下载源码</span><br><span class="line">https://github.com/google/googletest/</span><br><span class="line">2.CMake安装编译</span><br><span class="line"><span class="built_in">cd</span> googletest</span><br><span class="line"><span class="built_in">mkdir</span> build && <span class="built_in">cd</span> build</span><br><span class="line">cmake .. && make -j4</span><br><span class="line">make install</span><br><span class="line"></span><br><span class="line"><span class="comment">#GTest库文件安装在/usr/local/lib/目录,头文件安装在/usr/local/include/目录</span></span><br></pre></td></tr></table></figure><h2 id="2-使用"><a href="#2-使用" class="headerlink" title="2 使用"></a>2 使用</h2><ul><li><p><strong>断言含义</strong></p><ul><li><p>gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义</p></li><li><p><code><<</code>要提供自定义失败消息,只需使用运算符或一系列此类运算符将其流式传输到宏中 。请参阅以下示例,使用<code>ASSERT_EQ</code>and<code>EXPECT_EQ</code>宏来验证值相等</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ASSERT_EQ</span>(x.<span class="built_in">size</span>(), y.<span class="built_in">size</span>()) << <span class="string">"Vectors x and y are of unequal length"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < x.<span class="built_in">size</span>(); ++i) {</span><br><span class="line"> <span class="built_in">EXPECT_EQ</span>(x[i], y[i]) << <span class="string">"Vectors x and y differ at index "</span> << i;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul></li><li><p><strong>基础断言</strong></p></li></ul><table><thead><tr><th>Fatal assertion</th><th>Nonfatal assertion</th><th>Verifies</th></tr></thead><tbody><tr><td>ASSERT_TRUE(condition)</td><td>EXPECT_TRUE(condition)</td><td>condition is true</td></tr><tr><td>ASSERT_FALSE(condition)</td><td>EXPECT_FALSE(condition)</td><td>condition is false</td></tr></tbody></table><ul><li><strong>数值比较</strong></li></ul><table><thead><tr><th>Fatal assertion</th><th>Nonfatal assertion</th><th>Verifies</th></tr></thead><tbody><tr><td><code>ASSERT_EQ(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_EQ(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code>==</code> <em>val2</em></td></tr><tr><td><code>ASSERT_NE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_NE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code>!=</code> <em>val2</em></td></tr><tr><td><code>ASSERT_LT(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_LT(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code><</code> <em>val2</em></td></tr><tr><td><code>ASSERT_LE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_LE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code><=</code> <em>val2</em></td></tr><tr><td><code>ASSERT_GT(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_GT(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code>></code> <em>val2</em></td></tr><tr><td><code>ASSERT_GE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><code>EXPECT_GE(</code><em>val1</em><code>,</code><em>val2</em><code>);</code></td><td><em>val1</em> <code>>=</code> <em>val2</em></td></tr></tbody></table><ul><li><strong>字符串比较</strong></li></ul><table><thead><tr><th>Fatal assertion</th><th>Nonfatal assertion</th><th>Verifies</th></tr></thead><tbody><tr><td><code>ASSERT_STREQ(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td><code>EXPECT_STREQ(</code><em>str1</em><code>,</code>_str_2<code>);</code></td><td>the two C strings have the same content</td></tr><tr><td><code>ASSERT_STRNE(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td><code>EXPECT_STRNE(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td>the two C strings have different content</td></tr><tr><td><code>ASSERT_STRCASEEQ(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td><code>EXPECT_STRCASEEQ(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td>the two C strings have the same content, ignoring case(忽略大小写)</td></tr><tr><td><code>ASSERT_STRCASENE(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td><code>EXPECT_STRCASENE(</code><em>str1</em><code>,</code><em>str2</em><code>);</code></td><td>the two C strings have different content, ignoring case(忽略大小写)</td></tr></tbody></table><ul><li><strong>浮点数比较</strong></li></ul><table><thead><tr><th>Fatal assertion</th><th>Nonfatal assertion</th><th>Verifies</th></tr></thead><tbody><tr><td><code>EXPECT_FLOAT_EQ(val1,val2</code>)</td><td><code>EXPECT_FLOAT_EQ(val1, val2)</code></td><td>验证这两个<code>float</code>值*<code>val1</code><em>和</em><code>val2</code>*是否近似相等,彼此相差 4 个 ULP</td></tr><tr><td><code>EXPECT_DOUBLE_EQ(val1,val2</code>)</td><td><code>EXPECT_DOUBLE_EQ(val1, val2)</code></td><td>验证这两个<code>double</code>值*<code>val1</code><em>和</em><code>val2</code>*是否近似相等,彼此相差 4 个 ULP</td></tr><tr><td><code>ASSERT_NEAR(val1,val2,abs_error)</code></td><td><code>EXPECT_NEAR(val1,val2,abs_error)</code></td><td><em><code>val1</code><em>验证和之间的差</em><code>val2</code><em>不超过绝对误差界限</em><code>abs_error</code></em></td></tr></tbody></table><h2 id="3-sample"><a href="#3-sample" class="headerlink" title="3 sample"></a>3 sample</h2><ul><li>demo1见routing_planning/Notes/GoogleTest/demo1</li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><gtest/gtest.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">add</span><span class="params">(<span class="type">int</span> a ,<span class="type">int</span> b)</span></span>{</span><br><span class="line"> <span class="keyword">return</span> a+b;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//一个 test_case_name 对应一个函数的测试用例,test_name 可以对应这个测试用例下的某个场景的测试集。</span></span><br><span class="line"><span class="comment">//这两个名字可以任意取,但应该是有意义的,而且不能包含下划线 _</span></span><br><span class="line"><span class="built_in">TEST</span>(testCase , test0){</span><br><span class="line"> <span class="built_in">EXPECT_EQ</span>(<span class="built_in">add</span>(<span class="number">8</span>,<span class="number">11</span>),<span class="number">19</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">TEST</span>(testCase1 , test0){</span><br><span class="line"> <span class="built_in">EXPECT_EQ</span>(<span class="built_in">add</span>(<span class="number">7</span>,<span class="number">11</span>),<span class="number">18</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>{</span><br><span class="line"> testing::<span class="built_in">InitGoogleTest</span>();</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">RUN_ALL_TESTS</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">结果:</span><br><span class="line">[==========] Running <span class="number">2</span> tests from <span class="number">2</span> test suites.</span><br><span class="line">[----------] Global test environment set-up.</span><br><span class="line">[----------] <span class="number">1</span> test from testCase</span><br><span class="line">[ RUN ] testCase.test0</span><br><span class="line">[ OK ] testCase.<span class="built_in">test0</span> (<span class="number">0</span> ms)</span><br><span class="line">[----------] <span class="number">1</span> test from <span class="built_in">testCase</span> (<span class="number">0</span> ms total)</span><br><span class="line"></span><br><span class="line">[----------] <span class="number">1</span> test from testCase1</span><br><span class="line">[ RUN ] testCase1.test0</span><br><span class="line">[ OK ] testCase1.<span class="built_in">test0</span> (<span class="number">0</span> ms)</span><br><span class="line">[----------] <span class="number">1</span> test from <span class="built_in">testCase1</span> (<span class="number">0</span> ms total)</span><br><span class="line"></span><br><span class="line">[----------] Global test environment tear-down</span><br><span class="line">[==========] <span class="number">2</span> tests from <span class="number">2</span> test suites ran. (<span class="number">0</span> ms total)</span><br><span class="line">[ PASSED ] <span class="number">2</span> tests.</span><br></pre></td></tr></table></figure><ul><li>demo2较复杂直接见代码routing_planning/Notes/GoogleTest/demo2</li><li><a href="http://google.github.io/googletest/primer.html">http://google.github.io/googletest/primer.html</a>中还提供了测试夹具(对多个测试使用相同的数据配置)、调用测试等案例.</li></ul><hr><h1 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h1><h2 id="1-基本操作"><a href="#1-基本操作" class="headerlink" title="1 基本操作"></a>1 基本操作</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">查看正在运行的docker进程信息</span><br><span class="line">docker ps -a</span><br><span class="line"></span><br><span class="line">关掉某个docker进程</span><br><span class="line">docker stop (ID) </span><br></pre></td></tr></table></figure><h1 id="ROS-2"><a href="#ROS-2" class="headerlink" title="ROS 2"></a>ROS 2</h1><h2 id="1-ROS-1的弊端"><a href="#1-ROS-1的弊端" class="headerlink" title="1 ROS 1的弊端"></a>1 ROS 1的弊端</h2><ul><li><strong>多机器人系统</strong>:没有构建多机器人系统的标准<ul><li>因为ros1不支持多master的概念</li></ul></li><li><strong>跨平台</strong>:无法适用于windows、RTOS等系统</li><li><strong>实时性</strong>:缺少实时性方面的设计<ul><li>在毫秒级的实时性要求下,<code>ros1</code>底层的那套<code>TCP/UDP</code>通讯无法满足要求</li></ul></li><li><strong>网络连接</strong>:需要良好的网络环境保证数据的完整性<ul><li>WiFi不好或者数据量大的时候下会出现丢包情况(因为tcp/udp把ros的一些特性也封装进去了)</li></ul></li><li><strong>产品化</strong>:从科学研究到消费产品的过渡欠佳<ul><li>通常得维护两套代码</li></ul></li><li><strong>项目管理</strong>:无法胜任完整生命周期下项目管理<ul><li>缺乏一些自动化测试等工具</li></ul></li></ul><h2 id="2-ROS-2的设计思想"><a href="#2-ROS-2的设计思想" class="headerlink" title="2 ROS 2的设计思想"></a>2 ROS 2的设计思想</h2><ul><li><strong>架构的颠覆</strong><ul><li>ros1的架构下,所有节点需要使用Master进行管理</li><li>ros2使用基于DDS的Discovery机制,去掉了Master这一机制</li></ul></li><li><strong>API的重新设计</strong><ul><li>ros1中大部分代码都基于2009.2月设计的API(无法满足现在的很多语言新特性)</li><li>ros2重新设计了用户API,但使用方法类似<ul><li>ROS 2广泛使用C ++ 11。而ROS 1的核心主要使用C ++ 03,在其API并没有使用C++ 11功能</li><li>ROS 2的Python版本至少为3.5,ROS 1的Python版本为2.7</li></ul></li></ul></li><li><strong>编译系统升级</strong><ul><li>ros1使用rosbuild、catkin管理项目(项目多了后,会出现各种报错)</li><li>ros2使用升级版的ament、colcon(基于CMake改进的编译机制)</li></ul></li><li><strong>ros2的优点</strong><ul><li>支持多机器人系统(DDS的使用)</li><li>铲除原型与产品之间的鸿沟</li><li>支持微控制器(主要指MCU)</li><li>支持实时控制(DDS的使用 )</li><li>跨系统平台支持</li></ul></li></ul><h2 id="3-ROS-1-和-ROS-2-的区别"><a href="#3-ROS-1-和-ROS-2-的区别" class="headerlink" title="3 ROS 1 和 ROS 2 的区别"></a>3 ROS 1 和 ROS 2 的区别</h2><p><img src="https://nextpicture.oss-cn-shanghai.aliyuncs.com/typora_img/20191202220328111.png" alt="img"></p><table><thead><tr><th align="left"></th><th align="left">OS</th><th align="left">通讯</th><th align="left">节点模型</th><th align="left">进程</th></tr></thead><tbody><tr><td align="left"><strong>ROS 1</strong></td><td align="left">linux</td><td align="left">TCPROS/UDPROS</td><td align="left">publish/subscribe</td><td align="left">Nodelet</td></tr><tr><td align="left"><strong>ROS 2</strong></td><td align="left">linux、Windows、MAC、RTOS</td><td align="left">DDS</td><td align="left">discovery</td><td align="left">Intra-process</td></tr></tbody></table><p><img src="https://nextpicture.oss-cn-shanghai.aliyuncs.com/typora_img/image-20220404102101394.png" alt="image-20220404102101394"></p><ul><li>rclc的添加主要是ros2要适用于MCU的开发</li><li>ros2中多了一个ros2的Middleware API是为了适配不同的操作系统以及不同的DDS提供商</li></ul><h2 id="4-DDS-data-distribution-service数据分发服务"><a href="#4-DDS-data-distribution-service数据分发服务" class="headerlink" title="4 DDS(data distribution service数据分发服务)"></a>4 DDS(data distribution service数据分发服务)</h2><p> DDS信息发布中间件是一种轻便的、能够提供实时信息传送的中间件技术。DDS中间件是一个软件层,从操作系统、网络传输和底层数据格式的细节中抽象出应用。相同的概念和api提供给不同的编成语言,使得应用在不同的操作系统、编成语言和处理体系架构之间交换信息。底层细节包括数据传输格式、发现、连接、可靠性和、协议、Qos策略等由中间件来管理。</p><p> DDS采用发布/订阅体系架构,以数据为中心,提供丰富的Qos服务质量策略。</p><h2 id="5-ROS-2安装"><a href="#5-ROS-2安装" class="headerlink" title="5 ROS 2安装"></a>5 ROS 2安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">1. 设置编码</span><br><span class="line">sudo locale-gen en_US en_US.UTF-8</span><br><span class="line">sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8</span><br><span class="line"><span class="built_in">export</span> LANG=en_US.UTF-8</span><br><span class="line"></span><br><span class="line">2.设置软件源</span><br><span class="line">sudo apt update && sudo apt install curl gnupg2 lsb-release</span><br><span class="line">curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -</span><br><span class="line"> </span><br><span class="line">sudo sh -c <span class="string">'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'</span></span><br><span class="line"></span><br><span class="line">3.安装ROS2</span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install ros-foxy-desktop</span><br><span class="line"></span><br><span class="line">4.设置环境变量</span><br><span class="line"><span class="built_in">source</span> /opt/ros/foxy/setup.bash</span><br><span class="line"> 如果有安装ROS1,会提示一个警告</span><br><span class="line"></span><br><span class="line">5.安装自动补全工具</span><br><span class="line">sudo apt install python3-argcomplete</span><br><span class="line"> </span><br><span class="line">跑几个例程测试一下: 先运行一个talker:</span><br><span class="line"><span class="built_in">source</span> /opt/ros/foxy/setup.bash</span><br><span class="line">ros2 run demo_nodes_cpp talker</span><br><span class="line"> </span><br><span class="line">再运行一个Listener</span><br><span class="line"><span class="built_in">source</span> /opt/ros/foxy/setup.bash</span><br><span class="line">ros2 run demo_nodes_py listener</span><br><span class="line"></span><br><span class="line">6.删除</span><br><span class="line">如果哪一天不喜欢了,还可以这样删除:</span><br><span class="line">sudo apt remove ros-foxy-* </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">参考连接:https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html</span><br><span class="line">参考连接:https://www.guyuehome.com/10226</span><br></pre></td></tr></table></figure><blockquote><p>设置软件源可能出现如下问题:</p><p>curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused</p><p>解决:</p><p>修改hosts解决此问题的办法,不用科学上网。</p><p>在<a href="http://link.zhihu.com/?target=https://www.ipaddress.com/">https://www.ipaddress.com/</a>查询<a href="http://link.zhihu.com/?target=http://raw.githubusercontent.com">http://raw.githubusercontent.com</a>的真实IP 199.232.28.133 。</p><p>修改hosts,添加如下内容:</p><p>sudo gedit /etc/hosts</p><p>加入这一行:199.232.28.133 raw.githubusercontent.com</p></blockquote><h2 id="6-ROS-2使用"><a href="#6-ROS-2使用" class="headerlink" title="6 ROS 2使用"></a>6 ROS 2使用</h2><h3 id="1-ros1、ros2命令对比"><a href="#1-ros1、ros2命令对比" class="headerlink" title="1 ros1、ros2命令对比"></a>1 ros1、ros2命令对比</h3><ul><li><p>terminal 命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#相当于把ros1里面的命令分开</span></span><br><span class="line">rosrun --> ros2 run</span><br><span class="line">rosnode --> ros2 node</span><br><span class="line">roslaunch --> ros2 launch</span><br><span class="line">rosparam --> ros2 param</span><br><span class="line">rospkg --> ros2 pkg</span><br><span class="line">rosservice --> ros2 service </span><br><span class="line">rossrv --> ros2 srv</span><br><span class="line">rostopic --> ros2 topic</span><br><span class="line">rosaction --> ros2 action</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动rviz</span></span><br><span class="line">ros2 run rviz2 rviz2</span><br><span class="line"></span><br><span class="line"><span class="comment">#录包 & 回放</span></span><br><span class="line">ros2 bag record <topic></span><br><span class="line">ros2 bag play <bag_file_name></span><br></pre></td></tr></table></figure></li><li><p>bashrc存入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#ros1</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"source ~/catkin_ws/devel/setup.bash"</span> >> ~/.bashrc </span><br><span class="line"><span class="comment">#ros2</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"source ~/colcon_ws/install/setup.bash"</span> >> ~/.bashrc</span><br></pre></td></tr></table></figure></li><li><p>编译</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">catkin_make --> colcon build</span><br><span class="line"><span class="comment">#ros1</span></span><br><span class="line">catkin_make -DCATKIN_WHITELIST_PACKAGES=<span class="string">""</span> </span><br><span class="line"><span class="comment">#ros2</span></span><br><span class="line">colcon build --packages-select PACKAGE_NAME</span><br></pre></td></tr></table></figure></li><li><p>安装基础包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install ros-foxy-pluginlib </span><br><span class="line"></span><br><span class="line">ros1桥接</span><br><span class="line">roslaunch rosbridge_server rosbridge_websocket.launch</span><br></pre></td></tr></table></figure></li></ul><h3 id="2-功能包创建-amp-编译-amp-运行"><a href="#2-功能包创建-amp-编译-amp-运行" class="headerlink" title="2 功能包创建 & 编译 & 运行"></a>2 功能包创建 & 编译 & 运行</h3><h4 id="创建功能包"><a href="#创建功能包" class="headerlink" title="创建功能包"></a>创建功能包</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p dev_src/src</span><br><span class="line"><span class="built_in">cd</span> ~/dev_src/src</span><br><span class="line"></span><br><span class="line"><span class="comment">#创建功能包语法</span></span><br><span class="line">ros2 pkg create --build-type ament_cmake <package_name></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建功能包</span></span><br><span class="line">ros2 pkg create --build-type ament_cmake --node-name my_node my_package --dependencies rclcpp std_msgs (这一步便完成了my_node.cpp文件和my_package功能包的创建)</span><br><span class="line"></span><br><span class="line"> <span class="comment">#--dependencies 参数会将后边的依赖自动添加到package.xml和CMakeLists.txt中</span></span><br><span class="line"> </span><br><span class="line">将会产生如下文件:</span><br><span class="line">my_package/</span><br><span class="line">├── CMakeLists.txt</span><br><span class="line">├── include</span><br><span class="line">│ └── my_package</span><br><span class="line">├── package.xml</span><br><span class="line">└── src</span><br><span class="line"> └── my_node.cpp</span><br></pre></td></tr></table></figure><h4 id="编译功能包"><a href="#编译功能包" class="headerlink" title="编译功能包"></a>编译功能包</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">将目录退回到dev_src目录下</span><br><span class="line">运行 colcon build </span><br><span class="line">这个命令会编译工作空间中的所有功能包</span><br><span class="line"></span><br><span class="line">如果只想编译某一个包的话,可以这样:</span><br><span class="line">colcon build --packages-select my_package</span><br></pre></td></tr></table></figure><h4 id="设置环境变量"><a href="#设置环境变量" class="headerlink" title="设置环境变量"></a>设置环境变量</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">打开一个新的终端,运行下工作空间的环境变量,这样才能让该终端找到新创建的包:</span><br><span class="line">. install/setup.bash</span><br><span class="line"> 接下来就可以在该终端中运行新建的功能包</span><br></pre></td></tr></table></figure><h4 id="运行功能包中的节点"><a href="#运行功能包中的节点" class="headerlink" title="运行功能包中的节点"></a>运行功能包中的节点</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">接着上述 设置环境变量的步骤 运行</span><br><span class="line">ros2 run my_package my_node</span><br></pre></td></tr></table></figure><h4 id="修改package-xml和CMakeLists-txt"><a href="#修改package-xml和CMakeLists-txt" class="headerlink" title="修改package.xml和CMakeLists.txt"></a>修改package.xml和CMakeLists.txt</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">/*****************************************************/</span><br><span class="line">package.xml</span><br><span class="line"><span class="comment">#如何添加依赖包</span></span><br><span class="line">需要添加依赖项,放到ament_cmake下边:</span><br><span class="line"><depend>rclcpp</depend></span><br><span class="line"><depend>std_msgs</depend></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">/*****************************************************/</span><br><span class="line">CMakeLists.txt</span><br><span class="line"><span class="comment">#设置编译规则</span></span><br><span class="line">接下来打开CMakeLists.txt文件,在find_package语句下,新加入两行:</span><br><span class="line">find_package(rclcpp REQUIRED)</span><br><span class="line">find_package(std_msgs REQUIRED)</span><br><span class="line"></span><br><span class="line"><span class="comment">#然后再设置具体的编译规则</span></span><br><span class="line">add_executable(talker src/publisher_member_function.cpp)</span><br><span class="line">ament_target_dependencies(talker rclcpp std_msgs)</span><br><span class="line"></span><br><span class="line"><span class="comment">#最后还要设置安装的规则,这样ros2 run命令才找的到执行文件</span></span><br><span class="line">install(TARGETS</span><br><span class="line"> talker</span><br><span class="line"> DESTINATION</span><br><span class="line"> lib/<span class="variable">${PROJECT_NAME}</span>)</span><br></pre></td></tr></table></figure><h3 id="3-自定义msg和srv文件"><a href="#3-自定义msg和srv文件" class="headerlink" title="3 自定义msg和srv文件"></a>3 自定义msg和srv文件</h3><ol><li><p>创建功能包,并在此功能包中新建msg和srv文件夹</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ros2 pkg create --build-type ament_cmake tutorial_interfaces</span><br><span class="line"><span class="built_in">mkdir</span> msg srv</span><br></pre></td></tr></table></figure></li><li><p>在对应的msg和srv文件夹中创建<code>.msg</code>文件和<code>.srv</code>文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#tutorial_interfaces/msg/Num.msg</span></span><br><span class="line">int64 num</span><br><span class="line"></span><br><span class="line"><span class="comment">#tutorial_interfaces/srv/AddThreeInts.srv</span></span><br><span class="line">int64 a</span><br><span class="line">int64 b</span><br><span class="line">int64 c</span><br><span class="line">---</span><br><span class="line">int64 <span class="built_in">sum</span></span><br></pre></td></tr></table></figure></li><li><p>CMakeLists.txt</p><p>自定义的接口会装换成对应的语言代码,以供调用</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">#在CMakeLists.txt中添加</span><br><span class="line"><span class="built_in">find_package</span>(rosidl_default_generators REQUIRED)</span><br><span class="line"></span><br><span class="line"><span class="built_in">rosidl_generate_interfaces</span>(${PROJECT_NAME}</span><br><span class="line"> <span class="string">"msg/Num.msg"</span></span><br><span class="line"> <span class="string">"srv/AddThreeInts.srv"</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure></li><li><p>package.xml<br>因为接口依赖于rosidl_default_generators生成特定于语言的代码,所以需要在xml中声明对它的依赖。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#在package.xml中添加</span><br><span class="line"><build_depend>rosidl_default_generators</build_depend></span><br><span class="line"><exec_depend>rosidl_default_runtime</exec_depend></span><br><span class="line"><member_of_group>rosidl_interface_packages</member_of_group></span><br></pre></td></tr></table></figure></li><li><p>编译</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">colcon build --packages-select tutorial_interfaces</span><br><span class="line"> </span><br><span class="line">#编译后会产生Num.hpp和AddThreeInts.hpp文件 会在ros工作空间根目录下的install文件夹中</span><br></pre></td></tr></table></figure></li><li><p>如何确认已建好的msg和srv</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">1.在工作区的根目录下</span><br><span class="line">. install/setup.bash</span><br><span class="line"></span><br><span class="line">2.检查msg</span><br><span class="line">ros2 interface show tutorial_interfaces/msg/Num</span><br><span class="line"></span><br><span class="line">3.检查srv</span><br><span class="line">ros2 interface show tutorial_interfaces/srv/AddThreeInts</span><br></pre></td></tr></table></figure></li><li><p>测试<code>msg</code>和<code>srv</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">参考:https://docs.ros.org/en/foxy/Tutorials/Custom-ROS2-Interfaces.html</span><br><span class="line">源码在:routing_planning/Notes/ROS2_WORKSPACE/src 下的myint和my_package两个功能包中</span><br><span class="line"></span><br><span class="line">如何在一个功能包使用自定义msg,参考routing_planning/Notes/ROS2_WORKSPACE/src/more_interface文件</span><br></pre></td></tr></table></figure></li></ol><h3 id="4-添加依赖项"><a href="#4-添加依赖项" class="headerlink" title="4 添加依赖项"></a>4 添加依赖项</h3><p>有两种方法可以将你的包链接到一个新的依赖项。</p><ul><li>第一种也是推荐的方法是使用 ament 宏<code>ament_target_dependencies</code>。例如,假设我们要链接<code>my_target</code>线性代数库 Eigen3。</li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">find_package</span>(Eigen3 REQUIRED)</span><br><span class="line"><span class="built_in">ament_target_dependencies</span>(my_target Eigen3)</span><br></pre></td></tr></table></figure><p>它包括项目正确找到的必要头文件和库及其依赖项。它还将确保在使用覆盖工作空间时所有依赖项的包含目录都正确排序。</p><ul><li>第二种方法是使用<code>target_link_libraries</code>.</li></ul><p>现代 CMake 中推荐的方法是只使用目标,导出和链接它们。CMake 目标是命名空间中的成员,类似于 C++。例如,<code>Eigen3</code>定义目标<code>Eigen3::Eigen</code>。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">find_package</span>(Eigen3 REQUIRED)</span><br><span class="line"><span class="built_in">target_link_libraries</span>(my_target Eigen3::Eigen)</span><br></pre></td></tr></table></figure><blockquote><p>这还将包括必要的标头、库及其依赖项,但与之相反,<code>ament_target_dependencies</code>在使用覆盖工作区时可能无法正确排序依赖项</p></blockquote><h3 id="5-编写launch文件"><a href="#5-编写launch文件" class="headerlink" title="5 编写launch文件"></a>5 编写launch文件</h3><ol><li><p>在工作空间的根目录建立launch文件夹</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> launch</span><br></pre></td></tr></table></figure></li><li><p>编写launch文件</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#moremsgpub.py</span></span><br><span class="line"><span class="keyword">from</span> launch <span class="keyword">import</span> LaunchDescription</span><br><span class="line"><span class="keyword">from</span> launch_ros.actions <span class="keyword">import</span> Node</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_launch_description</span>():</span><br><span class="line"> <span class="keyword">return</span> LaunchDescription([</span><br><span class="line"> Node(</span><br><span class="line"> package=<span class="string">'more_interface'</span>, <span class="comment">#功能包名称</span></span><br><span class="line"> executable=<span class="string">'publish_address_book'</span>, <span class="comment">#可执行文件名称</span></span><br><span class="line"> output=<span class="string">'screen'</span> <span class="comment">#打印输出</span></span><br><span class="line"> ) </span><br><span class="line">])</span><br></pre></td></tr></table></figure></li><li><p>运行launch</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> launch</span><br><span class="line">ros2 launch moremsgpub.py</span><br><span class="line"></span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">ros2 launch <package_name> <launch_file_name></span><br></pre></td></tr></table></figure></li></ol><h2 id="7-使用ROS-2的一些命名规则"><a href="#7-使用ROS-2的一些命名规则" class="headerlink" title="7 使用ROS 2的一些命名规则"></a>7 使用ROS 2的一些命名规则</h2><ol><li>包名必须全部小写</li><li>自定义的MSG,SRV和Action文件必须首字母大写且不能有下划线,例如<code>Num.msg</code></li></ol><h2 id="8-ROS-DOMAIN-ID"><a href="#8-ROS-DOMAIN-ID" class="headerlink" title="8 ROS_DOMAIN_ID"></a>8 ROS_DOMAIN_ID</h2><p>如果在局域网的多台电脑中使用ROS2,默认的通信机制会自动建立各机器分布式通信框架,也就是不同电脑之间已经可以通信了,如果你不希望多台电脑之间产生连接,可以设置不同的组网ID,相同ID的电脑之间可以通信,不同ID的电脑之间无法通信。 </p><p><strong>临时端口</strong></p><p>默认情况下,Linux 内核使用端口 32768-60999 作为临时端口。这意味着域 ID 0-101 和 215-232 可以安全使用,而不会与临时端口冲突。临时端口范围可在 Linux 中通过在<code>/proc/sys/net/ipv4/ip_local_port_range</code>. 如果使用自定义临时端口范围,则可能必须相应调整上述数字。</p><p><strong>参与者限制</strong></p><p>对于计算机上运行的每个 ROS 2 进程,都会创建一个 DDS“参与者”。由于每个 DDS 参与者占用计算机上的两个端口,因此在一台计算机上运行 120 多个 ROS 2 进程可能会溢出到其他域 ID 或临时端口。</p><p><strong>Linux</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> ROS_DOMAIN_ID=<your_domain_id></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"export ROS_DOMAIN_ID=<your_domain_id>"</span> >> ~/.bashrc</span><br></pre></td></tr></table></figure><h2 id="9-clion里写ros2代码"><a href="#9-clion里写ros2代码" class="headerlink" title="9 clion里写ros2代码"></a>9 clion里写ros2代码</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Build your ros2 project workspace with CMAKE_EXPORT_COMPILE_COMMANDS, e.g. </span><br><span class="line">colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1</span><br><span class="line"></span><br><span class="line">This creates a compile_commands.json file <span class="keyword">in</span> your build/ directory. You need to copy it to top-level directory of your workspace (<span class="built_in">where</span> you have src/ and build/ directories. You can automate this step.</span><br><span class="line"></span><br><span class="line">Run your CLion, click File->Open, and select the compile_commands.json file, open it as a project.</span><br><span class="line"></span><br><span class="line">Things should work now. To check, hold Ctrl over an object of a class from another workspace package or from your ros2 distro package. You should be able to navigate to definitions with Ctrl-click.</span><br></pre></td></tr></table></figure><h2 id="10-foxglove连接"><a href="#10-foxglove连接" class="headerlink" title="10 foxglove连接"></a>10 foxglove连接</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># For Noetic (ROS 1)</span></span><br><span class="line">sudo apt install ros-noetic-rosbridge-suite</span><br><span class="line"></span><br><span class="line"><span class="comment"># For Galactic (ROS 2)</span></span><br><span class="line">sudo apt install ros-galactic-rosbridge-suite</span><br><span class="line"></span><br><span class="line"><span class="comment"># For ROS 1</span></span><br><span class="line">roslaunch rosbridge_server rosbridge_websocket.launch</span><br><span class="line"></span><br><span class="line"><span class="comment"># For ROS 2</span></span><br><span class="line">ros2 launch rosbridge_server rosbridge_websocket_launch.xml</span><br></pre></td></tr></table></figure><h1 id="Git-amp-Github"><a href="#Git-amp-Github" class="headerlink" title="Git & Github"></a>Git & Github</h1><h2 id="1-基础命令"><a href="#1-基础命令" class="headerlink" title="1 基础命令"></a>1 基础命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">clone</span> 克隆远程仓库</span><br><span class="line">init 初始化仓库</span><br><span class="line">remote 连接远程仓库</span><br><span class="line">pull 从远程仓库下拉获取新数据</span><br><span class="line">push 将本地仓库新增或修改文件上传到远程仓库</span><br><span class="line">add 添加文件或者修改文件,commit以及push之前使用</span><br><span class="line"><span class="built_in">log</span> 当前仓库提交过的日志信息</span><br><span class="line">status 当前仓库版本状态</span><br><span class="line">commit 提交到当前仓库中</span><br><span class="line">branch 分支命令,相关增删查操作</span><br><span class="line">checkout 使用远程仓库最后一个版本完全覆盖当前仓库内容/选择分支branch</span><br><span class="line">diff 对比版本内容</span><br><span class="line">merge 合并版本内容</span><br></pre></td></tr></table></figure><h2 id="2-提交代码"><a href="#2-提交代码" class="headerlink" title="2 提交代码"></a>2 提交代码</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">向本地仓库提交代码(终端操作)</span><br><span class="line">git init 初始化git仓库</span><br><span class="line">git status 查看文件状态</span><br><span class="line">git add 文件列表 追踪文件</span><br><span class="line">git commit -m 提交信息 向仓库中提交代码(原则:每次提交只包含一个功能,不要在一次提交中包含多个功能或功能中还有bug,不利于后期恢复项目的状态)</span><br><span class="line">git <span class="built_in">log</span> 查看提交记录</span><br><span class="line"></span><br><span class="line">向github中提交代码(终端操作)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"# grq"</span> >> README.md</span><br><span class="line">git init</span><br><span class="line">git add README.md</span><br><span class="line">git commit -m <span class="string">"first commit"</span></span><br><span class="line">git branch -M main</span><br><span class="line">git remote add origin [email protected]:NeXTzhao/grq.git(origin 为远程链接的别名)</span><br><span class="line">git push -u origin main</span><br><span class="line"> </span><br><span class="line"><span class="comment">#通常在vscode中实现,不回去调用命令行</span></span><br><span class="line"></span><br><span class="line">如何下载指定版本</span><br><span class="line">git <span class="built_in">clone</span> -b 1.x --depth 1 https://github.com/mehrpadin/Superfish-for-Drupal.git</span><br></pre></td></tr></table></figure><h2 id="3-编写-gitignore文件"><a href="#3-编写-gitignore文件" class="headerlink" title="3 编写.gitignore文件"></a>3 编写<code>.gitignore</code>文件</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"> 表示此为注释,将被Git忽略</span></span><br><span class="line">*.a 表示忽略所有 .a 结尾的文件</span><br><span class="line">!lib.a 表示但lib.a除外</span><br><span class="line">/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO</span><br><span class="line">build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;</span><br><span class="line">doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt</span><br><span class="line"> </span><br><span class="line">bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件</span><br><span class="line">/bin: 表示忽略根目录下的bin文件</span><br><span class="line">/*.c: 表示忽略cat.c,不忽略 build/cat.c</span><br><span class="line">debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj</span><br><span class="line">**/foo: 表示忽略/foo,a/foo,a/b/foo等</span><br><span class="line">a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等</span><br><span class="line">!/bin/run.sh 表示不忽略bin目录下的run.sh文件</span><br><span class="line">*.log: 表示忽略所有 .log 文件</span><br><span class="line">config.php: 表示忽略当前路径的 config.php 文件</span><br><span class="line"> </span><br><span class="line">/mtk/ 表示过滤整个文件夹</span><br><span class="line">*.zip 表示过滤所有.zip文件</span><br><span class="line">/mtk/do.c 表示过滤某个具体文件</span><br><span class="line"> </span><br><span class="line">被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。</span><br><span class="line"> </span><br><span class="line">需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:</span><br><span class="line">!*.zip</span><br><span class="line">!/mtk/one.txt</span><br><span class="line"> </span><br><span class="line">唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?</span><br><span class="line">想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::</span><br><span class="line">/mtk/*</span><br><span class="line">!/mtk/one.txt</span><br><span class="line"> </span><br><span class="line">假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!</span><br><span class="line">注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!</span><br><span class="line"> </span><br><span class="line">----------------------------------------------------------------------------------</span><br><span class="line">还有一些规则如下:</span><br><span class="line">fd1/*</span><br><span class="line">说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;</span><br><span class="line"> </span><br><span class="line">/fd1/*</span><br><span class="line">说明:忽略根目录下的 /fd1/ 目录的全部内容;</span><br><span class="line"> </span><br><span class="line">/*</span><br><span class="line">!.gitignore</span><br><span class="line">!/fw/ </span><br><span class="line">/fw/*</span><br><span class="line">!/fw/bin/</span><br><span class="line">!/fw/sf/</span><br><span class="line">说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。</span><br></pre></td></tr></table></figure><h2 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h2><p>vscode 会生成这个文件.vscode/browse.vc.db通常会很大,提交的时候记得忽略</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">例如:在.gitignore添加这两项</span><br><span class="line">ros/.vscode/browse.vc.db</span><br><span class="line">ros/src/lqr_steering/.vscode/browse.vc.db</span><br></pre></td></tr></table></figure><h1 id="AnaConda"><a href="#AnaConda" class="headerlink" title="AnaConda"></a>AnaConda</h1><h2 id="1-安装"><a href="#1-安装" class="headerlink" title="1 安装"></a>1 安装</h2><p>进入<a href="https://www.anaconda.com/">官网下载</a> sh文件,运行bash xx.sh即可</p><h2 id="2-环境"><a href="#2-环境" class="headerlink" title="2 环境"></a>2 环境</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">1.创建虚拟环境</span><br><span class="line">使用 conda create -n your_env_name python=X.X(2.7、3.6等)</span><br><span class="line"><span class="comment">#anaconda 命令创建python版本为X.X、名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到。 指定python版本为2.7,注意至少需要指定python版本或者要安装的包, 在不指定python版本时,自动安装最新python版本。</span></span><br><span class="line"> 例如:conda create -n env_name python=3.8 (创建anaconda环境后要conda init)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 同时安装必要的包</span></span><br><span class="line">conda create -n env_name numpy matplotlib</span><br><span class="line"></span><br><span class="line">2.进入虚拟环境</span><br><span class="line">conda activate your_env_name(虚拟环境名称)</span><br><span class="line"><span class="comment">#此时使用python --version可以检查当前python版本是否为想要的(即虚拟环境的python版本)。</span></span><br><span class="line"></span><br><span class="line">3.退出虚拟环境</span><br><span class="line">conda deactivate your_env_name(虚拟环境名称)</span><br><span class="line"></span><br><span class="line">4.删除虚拟环境:</span><br><span class="line">conda remove -n your_env_name(虚拟环境名称) --all, 即可删除。</span><br><span class="line"></span><br><span class="line">4.1 删除虚拟环境中的包:</span><br><span class="line">conda remove --name yourenvname yourenvnamepackage_name(包名) 即可。</span><br><span class="line"></span><br><span class="line">5.设置自动进入自定义环境</span><br><span class="line"><span class="comment">#先停用base</span></span><br><span class="line">conda config --<span class="built_in">set</span> auto_activate_base <span class="literal">false</span></span><br><span class="line"><span class="comment">#在.bashrc后面添加</span></span><br><span class="line">sudo gedit ~/.bashrc</span><br><span class="line">conda activate 自定义环境名</span><br><span class="line"><span class="comment">#退出后source</span></span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#通常ubuntu很多默认的工具都是使用Python2.*,但是Ubuntu20.04之后全部升级为python3,建议使用2004及以后的Ubuntu,可以避免很多麻烦</span></span><br><span class="line"><span class="comment">#创建anaconda后先conda init ,# export PATH="/home/next/anaconda3/bin:$PATH" 这一步也可以也不用</span></span><br></pre></td></tr></table></figure><h2 id="3-安装-amp-卸载库"><a href="#3-安装-amp-卸载库" class="headerlink" title="3 安装&卸载库"></a>3 安装&卸载库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">conda install -c conda-forge osqp</span><br><span class="line">conda install -c conda-forge osqp-eigen</span><br><span class="line"></span><br><span class="line">conda install numpy</span><br><span class="line">conda install matplotlib</span><br><span class="line"></span><br><span class="line">conda uninstall xxx //卸载xxx包</span><br><span class="line"></span><br><span class="line">如果conda里面没有想要的版本安装包,可以采用本地安装xxx.tar.bz2的方法:</span><br><span class="line">conda install --use-local 包名路径</span><br><span class="line">conda install --use-local /home/next/Downloads/osqp-0.4.1-py37h637b7d7_1001.tar.bz2</span><br><span class="line">安装成功会出现如下打印:</span><br><span class="line">Downloading and Extracting Packages</span><br><span class="line"><span class="comment">######################################################################## | 100% </span></span><br><span class="line">Preparing transaction: <span class="keyword">done</span></span><br><span class="line">Verifying transaction: <span class="keyword">done</span></span><br><span class="line">Executing transaction: <span class="keyword">done</span></span><br></pre></td></tr></table></figure><h2 id="4-conda常用命令"><a href="#4-conda常用命令" class="headerlink" title="4 conda常用命令"></a>4 conda常用命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">conda list 查看安装了哪些包。</span><br><span class="line">conda update --all 创建前最好将包都进行升级</span><br><span class="line">conda install package_name(包名) 安装包</span><br><span class="line">conda <span class="built_in">env</span> list 或 conda info -e查看当前存在哪些虚拟环境</span><br><span class="line">conda update conda 检查更新当前conda</span><br></pre></td></tr></table></figure><h1 id="matplotlib-cpp"><a href="#matplotlib-cpp" class="headerlink" title="matplotlib-cpp"></a>matplotlib-cpp</h1><h2 id="1-使用-1"><a href="#1-使用-1" class="headerlink" title="1 使用"></a>1 使用</h2><blockquote><p>在conda创建的环境下使用,可以避免很多不必要的麻烦</p></blockquote><ol><li>首先将<code>matplotlibcpp.h</code>文件放入工程下的<code>include</code>文件夹中</li><li>xx.cpp文件需要用到画图功能时,添加头文件 <code>#include "matplotlibcpp.h"</code></li><li>在<code>CMakeLists.txt</code>文件中添加链接及依赖,如下(以后直接复制粘贴,修改src/**.cpp和可执行文件名称就可以)</li></ol><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">include</span>(GNUInstallDirs)</span><br><span class="line"><span class="keyword">set</span>(PACKAGE_NAME matplotlib_cpp)</span><br><span class="line"><span class="keyword">set</span>(INSTALL_CONFIGDIR <span class="variable">${CMAKE_INSTALL_LIBDIR}</span>/<span class="variable">${PACKAGE_NAME}</span>/cmake)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Library target</span></span><br><span class="line"><span class="keyword">add_library</span>(matplotlib_cpp INTERFACE)</span><br><span class="line"><span class="keyword">target_include_directories</span>(matplotlib_cpp</span><br><span class="line"> INTERFACE</span><br><span class="line"> $<BUILD_INTERFACE:<span class="variable">${PROJECT_SOURCE_DIR}</span>/examples></span><br><span class="line"> $<INSTALL_INTERFACE:<span class="keyword">include</span>></span><br><span class="line">)</span><br><span class="line"><span class="keyword">target_compile_features</span>(matplotlib_cpp INTERFACE</span><br><span class="line"> cxx_std_20</span><br><span class="line">)</span><br><span class="line"><span class="comment"># <span class="doctag">TODO:</span> Use `Development.Embed` component when requiring cmake >= 3.18</span></span><br><span class="line"><span class="keyword">find_package</span>(Python3 COMPONENTS Interpreter Development REQUIRED)</span><br><span class="line"><span class="keyword">target_link_libraries</span>(matplotlib_cpp INTERFACE</span><br><span class="line"> Python3::Python</span><br><span class="line"> Python3::Module</span><br><span class="line">)</span><br><span class="line"><span class="keyword">find_package</span>(Python3 COMPONENTS NumPy)</span><br><span class="line"><span class="keyword">if</span>(Python3_NumPy_FOUND)</span><br><span class="line"> <span class="keyword">target_link_libraries</span>(matplotlib_cpp INTERFACE</span><br><span class="line"> Python3::NumPy</span><br><span class="line"> )</span><br><span class="line"><span class="keyword">else</span>()</span><br><span class="line"> <span class="keyword">target_compile_definitions</span>(matplotlib_cpp INTERFACE WITHOUT_NUMPY)</span><br><span class="line"><span class="keyword">endif</span>()</span><br><span class="line"><span class="keyword">install</span>(</span><br><span class="line"> TARGETS matplotlib_cpp</span><br><span class="line"> <span class="keyword">EXPORT</span> <span class="keyword">install_targets</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Examples</span></span><br><span class="line"><span class="keyword">add_executable</span>(midpoints src/midpoints.cpp)</span><br><span class="line"><span class="keyword">target_link_libraries</span>(midpoints PRIVATE matplotlib_cpp)</span><br><span class="line"><span class="keyword">set_target_properties</span>(midpoints PROPERTIES RUNTIME_OUTPUT_DIRECTORY <span class="string">"${CMAKE_BINARY_DIR}/bin"</span>)</span><br></pre></td></tr></table></figure><h2 id="2-图形设置"><a href="#2-图形设置" class="headerlink" title="2 图形设置"></a>2 图形设置</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">颜色:</span><br><span class="line">b: blue</span><br><span class="line"> g: green</span><br><span class="line"> r: red</span><br><span class="line"> c: cyan</span><br><span class="line"> m: magenta</span><br><span class="line"> y: yellow</span><br><span class="line"> k: black</span><br><span class="line"> w: white</span><br><span class="line">线性:</span><br><span class="line">plt::<span class="built_in">named_plot</span>(<span class="string">"l_bound"</span>, l_bound,</span><br><span class="line"> <span class="string">"r*"</span>); <span class="comment">//(取名,参数(vector数组),红色离散点)</span></span><br><span class="line"> plt::<span class="built_in">named_plot</span>(<span class="string">"u_bound"</span>, u_bound,</span><br><span class="line"> <span class="string">"ro-"</span>); <span class="comment">//(取名,参数,红色直线连接)</span></span><br></pre></td></tr></table></figure><h1 id="Eigen"><a href="#Eigen" class="headerlink" title="Eigen"></a>Eigen</h1><blockquote><p>从向量Vector的角度来看,矩阵都应该以列方式来存储,以列来理解和存储更符合实际需要.</p></blockquote><h2 id="1-源码安装"><a href="#1-源码安装" class="headerlink" title="1 源码安装"></a>1 源码安装</h2><p><strong>见</strong><a href="https://blog.csdn.net/yuan0061/article/details/83002229?ops_request_misc=&request_id=&biz_id=102&utm_term=EIGEN%E5%AE%89%E8%A3%85&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-83002229.142%5Ev3%5Epc_search_result_control_group,143%5Ev4%5Eregister&spm=1018.2226.3001.4187">CSDN</a>,安装位置在<code>usr/local/include</code> 和 <code>/usr/include</code>,使用时添加头文件 <code>#include<Eigen/Eigen.h></code> </p><h2 id="2-内置类型"><a href="#2-内置类型" class="headerlink" title="2 内置类型"></a>2 内置类型</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">Eigen通过tyepdef定义了许多内置类型,不过底层仍然是Eigen::Matrix,如下所示:</span><br><span class="line"> <span class="comment">//初始化为0 //Matrix3d实质上是Eigen::Matrix<double, 3, 3> </span></span><br><span class="line"> Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::<span class="built_in">Zero</span>(): </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//如果不确定矩阵大小,可以使用动态大小的矩阵</span></span><br><span class="line">Eigen::Matrix<<span class="type">double</span>, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic; </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//与上类似,表示任意大小的元素类型为double的矩阵变量</span></span><br><span class="line">Eigen::MatrixXd matrix_xd; </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//表示任意大小的元素类型为float的矩阵变量</span></span><br><span class="line"> Eigen::MatrixXf matrix_xf; </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//Vector3d实质上是Eigen::Matrix<double, 3, 1> 三行一列</span></span><br><span class="line">Eigen::Vector3d v_3d;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-使用"><a href="#3-使用" class="headerlink" title="3 使用"></a>3 使用</h2><ul><li><p><strong>加减乘除跟数字操作一样</strong></p></li><li><p><strong>赋值操作</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">matrix_33<<<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>;</span><br><span class="line">或 <span class="built_in">matrix_33</span>(<span class="number">0</span>,<span class="number">0</span>)=<span class="number">1</span>;</span><br></pre></td></tr></table></figure></li><li><p><strong>矩阵操作</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cout << matrix_33.<span class="built_in">transpose</span>() << endl; <span class="comment">//转置</span></span><br><span class="line">cout << matrix_33.<span class="built_in">sum</span>() << endl; <span class="comment">//各元素和</span></span><br><span class="line">cout << matrix_33.<span class="built_in">trace</span>() << endl; <span class="comment">//迹</span></span><br><span class="line">cout << matrix_33 * <span class="number">10</span> << endl; <span class="comment">//数乘</span></span><br><span class="line">cout << matrix_33.<span class="built_in">inverse</span>() << endl; <span class="comment">//逆</span></span><br><span class="line">cout << matrix_33.<span class="built_in">determinant</span>() << endl; <span class="comment">//行列式</span></span><br><span class="line">cout << matrix_33.<span class="built_in">adjoint</span>() << endl; <span class="comment">//伴随</span></span><br><span class="line">cout << matrix_33.<span class="built_in">cwiseAbs</span>() << endl; <span class="comment">//绝对值</span></span><br><span class="line">cout << matrix_33.<span class="built_in">maxCoeff</span>() << endl; <span class="comment">//求最大系数</span></span><br></pre></td></tr></table></figure></li><li><p><strong>求解Ax=b</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 求解Ax=b ; Vector2d => Matrix<double,2, 1></span></span><br><span class="line">Eigen::Vector2d C = A.<span class="built_in">colPivHouseholderQr</span>().<span class="built_in">solve</span>(b); </span><br><span class="line"></span><br><span class="line"><span class="built_in">cwiseAbs</span>()求绝对值</span><br><span class="line"><span class="built_in">maxcoff</span>()求最大系数</span><br></pre></td></tr></table></figure></li><li><p><strong>单位矩阵</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Eigen::MatrixXd::<span class="built_in">Identity</span>(<span class="number">4</span>, <span class="number">4</span>) </span><br><span class="line"><span class="keyword">or</span></span><br><span class="line">Eigen::Matrix<<span class="type">double</span> ,<span class="number">4</span>,<span class="number">4</span>> A;</span><br><span class="line">A.<span class="built_in">setIdentity</span>(<span class="number">4</span>, <span class="number">4</span>);</span><br></pre></td></tr></table></figure></li><li><p><strong>稀疏矩阵</strong></p></li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Values:<span class="comment">//存储非零的系数值。</span></span><br><span class="line">InnerIndices:<span class="comment">//存储非零的行(列)索引。</span></span><br><span class="line">OuterStarts:<span class="comment">//为每一列(相应的行)存储前两个数组中第一个非零的索引。</span></span><br><span class="line">InnerNNZs:<span class="comment">//存储每列(分别为行)的非零数。这个词inner指的是一个内部 向量,它是列主矩阵的列,或行主矩阵的行。这个词outer指的是另一个方向。</span></span><br></pre></td></tr></table></figure><h1 id="稀疏矩阵csc-matrix"><a href="#稀疏矩阵csc-matrix" class="headerlink" title="稀疏矩阵csc_matrix"></a>稀疏矩阵csc_matrix</h1><h2 id="1-稀疏矩阵数组的含义"><a href="#1-稀疏矩阵数组的含义" class="headerlink" title="1 稀疏矩阵数组的含义"></a>1 <a href="https://www.bu.edu/pasi/files/2011/01/NathanBell1-10-1000.pdf">稀疏矩阵数组的含义</a></h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">indptr = [ ] <span class="comment">//以累加的方式存储每一列包含有非零数字的个数,从0开始。</span></span><br><span class="line">indices = [ ] <span class="comment">//存储非零数字所在的行索引值。</span></span><br><span class="line">data = [ ] <span class="comment">//以列顺序存储所有非零的数字。</span></span><br></pre></td></tr></table></figure><h2 id="2-sample"><a href="#2-sample" class="headerlink" title="2 sample"></a>2 sample</h2><p><img src="https://nextpicture.oss-cn-shanghai.aliyuncs.com/typora_img/20210706133100832.png" alt="在这里插入图片描述"></p><p><img src="https://img-blog.csdnimg.cn/20210706135142194.png" alt="在这里插入图片描述"></p><h1 id="性能优化"><a href="#性能优化" class="headerlink" title="性能优化"></a>性能优化</h1><h2 id="Inter-VTune-Profiler"><a href="#Inter-VTune-Profiler" class="headerlink" title="Inter VTune Profiler"></a><a href="https://www.intel.com/content/www/us/en/develop/documentation/vtune-cookbook/top/configuration-recipes/flame-graph-cpp.html">Inter VTune Profiler</a></h2><h3 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a><a href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler-download.html?operatingsystem=linux&distributions=webdownload&options=offline">下载安装</a></h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https:<span class="comment">//registrationcenter-download.intel.com/akdlm/irc_nas/18447/l_oneapi_vtune_p_2022.1.0.98_offline.sh</span></span><br><span class="line"></span><br><span class="line">sudo sh ./l_oneapi_vtune_p_2022<span class="number">.1</span><span class="number">.0</span><span class="number">.98</span>_offline.sh</span><br><span class="line">默认安装在 /opt/intel/oneapi/</span><br></pre></td></tr></table></figure><h3 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">在安装路径下</span><br><span class="line"> <span class="built_in">cd</span> /opt/intel/oneapi/</span><br><span class="line"><span class="built_in">source</span> setvars.sh </span><br><span class="line">再运行</span><br><span class="line">vtune-gui</span><br><span class="line"></span><br><span class="line">记得要选择collect stack,才会有FlameGraph</span><br></pre></td></tr></table></figure><h3 id="需要修改的系统文件"><a href="#需要修改的系统文件" class="headerlink" title="需要修改的系统文件"></a>需要修改的系统文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo sysctl kernel.kptr_restrict=0</span><br><span class="line">sudo sysctl kernel.perf_event_paranoid=1</span><br><span class="line"> </span><br><span class="line">可能会出现一些库文件的安装,根据提示sudo apt install 安装就可以</span><br></pre></td></tr></table></figure><h1 id="valgrind"><a href="#valgrind" class="headerlink" title="valgrind"></a>valgrind</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">valgrind --tool=memcheck --leak-check=full ./ReferenceLine </span><br></pre></td></tr></table></figure><h1 id="Gflags"><a href="#Gflags" class="headerlink" title="Gflags"></a>Gflags</h1><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/gflags/gflags.git </span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> build </span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> build</span><br><span class="line"></span><br><span class="line"><span class="comment">#这一步非常重要,这些选项就是动态库和静态库的选项,都要打开,不然编译glog会报错</span></span><br><span class="line">cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON ..</span><br><span class="line"></span><br><span class="line">make -j8</span><br><span class="line"></span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cmake_minimum_required</span> (VERSION <span class="number">3.16</span>)</span><br><span class="line"><span class="keyword">project</span> (myproj VERSION <span class="number">1.0</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">find_package</span> (glog <span class="number">0.6</span>.<span class="number">0</span> REQUIRED)</span><br><span class="line"></span><br><span class="line"><span class="keyword">add_executable</span> (myapp main.cpp)</span><br><span class="line"><span class="keyword">target_link_libraries</span> (myapp glog::glog)</span><br></pre></td></tr></table></figure><h1 id="Glog"><a href="#Glog" class="headerlink" title="Glog"></a>Glog</h1><h2 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/google/glog.git</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> glog</span><br><span class="line"></span><br><span class="line"><span class="comment">#这一步要注意gflags的链接库编译选项要打开</span></span><br><span class="line"><span class="built_in">mkdir</span> build</span><br><span class="line"></span><br><span class="line">cmake ..</span><br><span class="line"></span><br><span class="line">make -j8</span><br><span class="line"></span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><h2 id="使用-1"><a href="#使用-1" class="headerlink" title="使用"></a>使用</h2><h1 id="Cerse"><a href="#Cerse" class="headerlink" title="Cerse"></a>Cerse</h1><h2 id="使用-2"><a href="#使用-2" class="headerlink" title="使用"></a>使用</h2><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cmake_minimum_required</span>(VERSION <span class="number">3.5</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">project</span>(helloworld)</span><br><span class="line"></span><br><span class="line"><span class="keyword">find_package</span>(Ceres REQUIRED)</span><br><span class="line"></span><br><span class="line"><span class="comment"># helloworld</span></span><br><span class="line"><span class="keyword">add_executable</span>(helloworld helloworld.cc)</span><br><span class="line"><span class="keyword">target_link_libraries</span>(helloworld Ceres::ceres)</span><br></pre></td></tr></table></figure><h1 id="clang-formate"><a href="#clang-formate" class="headerlink" title="clang formate"></a>clang formate</h1><h2 id="格式配置"><a href="#格式配置" class="headerlink" title="格式配置"></a>格式配置</h2><p>c++格式统一,采用Google的风格</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"># Use the Google style in <span class="keyword">this</span> project.</span><br><span class="line">BasedOnStyle: Google</span><br><span class="line"></span><br><span class="line"># Some folks prefer to write <span class="string">"int& foo"</span> <span class="keyword">while</span> others prefer <span class="string">"int &foo"</span>. The</span><br><span class="line"># Google Style Guide only asks <span class="keyword">for</span> consistency within a project, we chose</span><br><span class="line"># <span class="string">"int& foo"</span> <span class="keyword">for</span> <span class="keyword">this</span> project:</span><br><span class="line">DerivePointerAlignment: <span class="literal">false</span></span><br><span class="line">PointerAlignment: Left</span><br><span class="line"></span><br><span class="line"># The Google Style Guide only asks <span class="keyword">for</span> consistency w.r.t. <span class="string">"east const"</span> vs.</span><br><span class="line"># <span class="string">"const west"</span> alignment of cv-qualifiers. In <span class="keyword">this</span> project we use <span class="string">"east const"</span>.</span><br><span class="line">QualifierAlignment: Right</span><br><span class="line"></span><br><span class="line">IncludeBlocks: Merge</span><br><span class="line">IncludeCategories:</span><br><span class="line"># Matches common headers first, but sorts them after project includes</span><br><span class="line">- Regex: <span class="string">'^\"google/cloud/internal/disable_deprecation_warnings.inc\"$'</span></span><br><span class="line"> Priority: <span class="number">-1</span></span><br><span class="line">- Regex: <span class="string">'^\"google/cloud/(internal/|grpc_utils/|testing_util/|[^/]+\.h)'</span></span><br><span class="line"> Priority: <span class="number">1000</span></span><br><span class="line">- Regex: <span class="string">'^\"google/cloud/'</span> <span class="meta"># project includes should sort first</span></span><br><span class="line"> Priority: <span class="number">500</span></span><br><span class="line">- Regex: <span class="string">'^\"'</span></span><br><span class="line"> Priority: <span class="number">1500</span></span><br><span class="line">- Regex: <span class="string">'^<grpc/'</span></span><br><span class="line"> Priority: <span class="number">2000</span></span><br><span class="line">- Regex: <span class="string">'^<google/*'</span></span><br><span class="line"> Priority: <span class="number">3000</span></span><br><span class="line">- Regex: <span class="string">'^<.*/.*'</span></span><br><span class="line"> Priority: <span class="number">4000</span></span><br><span class="line">- Regex: <span class="string">'^<[^/]*>'</span></span><br><span class="line"> Priority: <span class="number">5000</span></span><br><span class="line"></span><br><span class="line"># Format raw string literals with a `pb` <span class="keyword">or</span> `proto` tag as proto.</span><br><span class="line">RawStringFormats:</span><br><span class="line">- Language: TextProto</span><br><span class="line"> Delimiters:</span><br><span class="line"> - <span class="string">'pb'</span></span><br><span class="line"> - <span class="string">'proto'</span></span><br><span class="line"> BasedOnStyle: Google</span><br><span class="line"></span><br><span class="line">CommentPragmas: <span class="string">'(@copydoc)'</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="GCC编译器"><a href="#GCC编译器" class="headerlink" title="GCC编译器"></a>GCC编译器</h1><h2 id="1-cpp文件编译过程"><a href="#1-cpp文件编译过程" class="header</summary>
</entry>
</feed>