slam学习之旅——hello slam

1 新建工作文件夹

       使用mkdir命令新建文件夹 slambook和ch1文件夹,并利用cd命令进入ch1文件下,截图如

      


2 编写helloslam小程序

     使用vim命令创建helloslam.cpp文件,并填写如下代码

     

     

   按esc键,输入:wq退出


3 编译helloslam程序

3.1 使用g++命令编译

编译命令使用如下图

此时利用ls命令可以看到ch1文件夹下多了一个a.out的可执行文件,其中a.out是该命令默认生成的可执行文件名字

若想生成其他名字的可执行文件,在调用g++命令时在其后添加-o,如下,可看到生成了hell的可执行文件

补充:关于g++命令的补充说明

g++ –c Hello.cc  编译文件,生成目标文件 Hello.o

g++ Hello.o –o abc  连接 并重命名为可执行文件 abc

g++ Hello.cc    编译连接一起,生成a.out

g++ Hello.cc –o hello 生成a.out并命名为hello

3.2 使用cmake编译

       理论上说,任意一个C++ 程序都可以用g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和里边的源文件,这时输入的编译命令将越来越长。通常一个小型c++ 项目含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠g++ 命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++ 项目,使用一些工程管理工具会更加高效。在历史上工程师们曾使用makefile 进行自动编译,但下面要谈的cmake 比它更加方便

       在一个cmake 工程中,我们会用cmake 命令生成一个makefile 文件,然后,用make命令,根据这个makefile 文件的内容,编译整个工程

      首先利用rm命令将之前生成的可执行文件删除,此时ch1文件夹下只包含一个helloslam.cpp文件

3.2.1  制作一个工程

       在ch1文件夹下,利用vim命令新建一个CMakeLists.txt文件,在该文件中添加如下部分

      

      每个CMakeLists.txt 文件,告诉cmake 我们要对这个目录下的文件做什么事情。CMakeLists.txt 文件内容需要遵守cmake 的语法。这个示例中,我们演示了最基本的工程:指定一个工程名和一个可执行程序

     注意:cmake根据CMakeLists.txt文件生成包含一系列文件的工程,其中生成的最重要的文件时makefile文件,make命令会根据此文件所制定的规则生成一些列文件(文件可能是库文件,也可能是可执行程序)

       此时ch1文件夹下只有2个文件,如下

      

3.2.2 调用cmke命令新建工程

        命令使用如下,注意cmake命令后面有一个点(.),此点表示在当前文件夹,故此条命令的意思是在当前文件夹下创建工程。以下是正确创建后输出信息

      

     执行cmake命令前该文件夹ch1种只有2个文件,执行cmake命令后再次调用ls命令可以看到该文件夹下多了很多文件夹和文件,如下

     

3.2.3 编译helloslam.cpp

         调用命令make生成可执行文件,如下,图中可以看到生成了绿色的helloslam文件(可执行文件)

      

3.3 上述2种编译方式的区别

       cmake 过程处理了工程文件之间的关系,而make 过程实际调用了g++ 来编译程序。虽然这个过程中多了调用cmake 和make 的步骤,但我们对项目的编译管理工作,从输入一串g++ 命令,变成了维护若干个比较直观的CMakeLists.txt 文件,这将明显降低维护整个工程的难度。比如,当我想新增一个可执行文件时,只需在CMakeLists.txt 中添加一行“add_executable”命令即可,而后续的步骤都是不变的。cmake 会帮我们解决代码的依赖关系,无需我们输入一大串g++ 命令。

3.4 使用库文件来实现hello

         此部分为另外一种生成hello程序功能的方法,故需要将之前的文件全部清空,即工作目录ch1下为空。

         在一个C++ 工程中,并不是所有代码都会编译成可执行文件。只有带有main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西,供其他程序调用。这个东西叫做库。一个库往往是许多算法、程序的集合。

        在Linux 中,库文件分成静态库和共享库两种¬。静态库以.a 作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间

3.4.1 生成静态库文件

        在ch1目录下利用vim闯将文件libhelloslam.cpp,并添加代码如下:   

                                                                                             

    B 使用vim创建文件CMakeLists.txt,并添加如下代码

     

C 使用mkdir命令创建build目录,用于存放产生的一系列文件,如下

    

D 进入build文件夹,并调用cmake命令创建工程,如下

   

E 在ch1目录下调用make,生成库文件,如下,可以看到多出了一个文件   libhello.a

    

3.4.2 生成共享库文件

       方法步骤与静态库文件基本相同,唯一不同的是在CMakeLists.txt文件中声明不一样,如下是共享库文件声明方法

                            

        注意到:我们并没有注释掉静态库的声明,因为:2种库文件的生成互不影响,只要2种类型库文件的名字不一样即可,本例中静态库文件名字为hello,而共享库文件名字为hello1.

       其他步骤与静态库文件一样,成功生成后如下:

     

     

      

  3.4.3 使用库文件          

        库文件是一个压缩包,里头带有编译好的二进制函数。不过,仅有.a 或.so 库文件的话,我们并不知道它里头的函数到底是什么,调用的形式又是什么样的。为了让别人(或者自己)使用这个库,我们需要提供一个头文件,说明这些库里都有些什么。因此,对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库了

  A   利用vim在工作目录ch1下创建libhelloslam.h,并添加如下代码

   

   

B.利用vim在ch1目录下生成usehello.cpp,如下:

  

 C.在CMakeLists.txt文件中添加可执行程序的生成命令,同时添加库文件的链接声明

 

D.在build文件夹中调用cmake和make,生成可执行程序usehello

  

3.5 使用IDE

        集成开发环境(Integrated Development Environment,IDE)

        IDE 为开发者提供了跳转、补全、断点调试等很多方便的功能

        Linux 下的IDE 有很多种。虽然与Windows 下的Visual Studio 还有一些差距,不过支持C++ 开发的也有好几种,例如Eclipse、Qt Creator、Code::Blocks、Clion 等等

        Kdevelop的优点列举如下:
                                                1. 支持cmake 工程。
                                                2. 对c++ 支持较好(包括11 标准)。有高亮、跳转、补全等功能。能自动排版代码。
                                                3. 能方便地看到各个文件和目录树。
                                                4. 有一键编译、断点调试等功能。
                                                5. 无须付费。

3.5.1 安装

        Kdevelop。它是一个免费软件,在Ubuntu 的源中提供,这意味着你可以用apt-get 来安装它

        输入sudo apt-get install kdevelop进行安装

3.5.2打开kdevelop

         输入kdevelop打开,打开后界面如下

   

3.5.3 新建工程

      a  点击上方的工程,选择从模版新建

         

     b.在创建新工程界面添加相应信息

        

        c 点击上图中的next按钮,进行下一步

            

        d 点击finish按钮,完成工程的创建

          

          图中:第一栏是cmake命令的可执行程序目录;第二栏是本程序的编译运行目录,点击ok完成创建

          生成成功后结果图如下

     

3.5.4 添加相应代码

        本工程使用库文件来输出helloworld

   a.首先添加库文件的源文件,即libhello.cpp

       右键工程名helloslam,点击创建文件

      

    在弹出的窗口中添加源文件的名字,即libhello.cpp,如下,点击ok按钮

     

    在新创建的cpp文件中添加如下代码

   

  b.添加库文件的头文件,即libhello.h,并添加如下代码

      与创建库文件libhello.cpp的方式相同,添加后如下图

    

  c.在CMakeLists.txt文件中添加生成lib的相应信息

  

 d.对main文件添加相应代码

   

e.在CMakeLists.txt文件中为此工程的可执行文件helloslam添加lib库的链接

  

3.5.5 编译程序

 点击界面上的构建按钮,或者直接按F8,相当于输入了cmake和make命令   

3.5.6 执行程序

a.执行程序前需要确保2步,其一就是已经点击过构建按钮(即已经正确编译链接,即cmake和make命令都执行成功,记住:只要make clean过工程,就需要重新构建);其二在点击execute按钮时需要指定启动器,即添加可执行程序的路径,如下

点击execute按钮,如果是第一次运行(或者使用过make clean,或清理过该工程)都会弹出配置启动器的对话框,如下

上图中选中工程名字helloslam, 然后点击新建,会自动弹出我们可执行程序的路径,如下,点击ok完成

再次点击界面上的execute按钮,成功执行

 


4 错误集锦

4.1 在步骤3.2.2时报错

    错误信息如下所示时,请仔细检查自己的CMakeLists.txt文件

 

笔者报上述错误原因如下,即工程名中间多了一个空格,去掉空格后即正常建立工程

4.2 在步骤3.4.3的D步骤时

   出现错误如图,此错误为找不到usehello.cpp中包含的头文件。

  解决方法:确保此头文件【libhelloslam.h】在ch1目录情况下,查看usehello.cpp中include语句,正确的include语句如下:  

笔者错误的include语句如下:注意引号和尖括号的区别

补充:引号和尖括号的include语句区别如下:

include有两种形式:

1,#include "  *.h":表示先在当前工程目录下查找头文件,如果没有再按标准方式查找;这种方式常用于用户自定义头文件的查找。

2,#include<*.h>:表示按标准方式查找头文件,即直接到系统指定的某些目录中去找某些头文件。

4.3  在步骤3.4.3的D步

         出现以下错误,则表示在CMakeLists.txt文件中忘记了将库文件链接到可执行程序上,即忘记写target_link_libraries(可执行程序名字  库文件名字)

4.4  在步骤3.4.3的D步

   出现以下错误,表示忘记在usehello.cpp中添加include,即没有包含库文件的头文件(libhelloslam.h)

 

注意:若库文件的头文件(libhelloslam.h)和target_link_libraries(可执行程序名字  库文件名字)均忘记添加,则会先出现4.4的错误,解决掉之后会出现4.3的错误。原因是在CMakeLists.txt文件中首先是生成可执行文件,然后才链接可执行文件到库文件上。

参考:
https://blog.csdn.net/u013378306/article/details/52424826   【gcc/g++编译 cpp/c文件 生成可执行文件】

猜你喜欢

转载自blog.csdn.net/guosuling/article/details/83930164