使用mkdir命令新建文件夹 slambook和ch1文件夹,并利用cd命令进入ch1文件下,截图如
使用vim命令创建helloslam.cpp文件,并填写如下代码
按esc键,输入:wq退出
编译命令使用如下图
此时利用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
理论上说,任意一个C++ 程序都可以用g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和里边的源文件,这时输入的编译命令将越来越长。通常一个小型c++ 项目含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠g++ 命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++ 项目,使用一些工程管理工具会更加高效。在历史上工程师们曾使用makefile 进行自动编译,但下面要谈的cmake 比它更加方便
在一个cmake 工程中,我们会用cmake 命令生成一个makefile 文件,然后,用make命令,根据这个makefile 文件的内容,编译整个工程
首先利用rm命令将之前生成的可执行文件删除,此时ch1文件夹下只包含一个helloslam.cpp文件
在ch1文件夹下,利用vim命令新建一个CMakeLists.txt文件,在该文件中添加如下部分
每个CMakeLists.txt 文件,告诉cmake 我们要对这个目录下的文件做什么事情。CMakeLists.txt 文件内容需要遵守cmake 的语法。这个示例中,我们演示了最基本的工程:指定一个工程名和一个可执行程序
注意:cmake根据CMakeLists.txt文件生成包含一系列文件的工程,其中生成的最重要的文件时makefile文件,make命令会根据此文件所制定的规则生成一些列文件(文件可能是库文件,也可能是可执行程序)
此时ch1文件夹下只有2个文件,如下
命令使用如下,注意cmake命令后面有一个点(.),此点表示在当前文件夹,故此条命令的意思是在当前文件夹下创建工程。以下是正确创建后输出信息
执行cmake命令前该文件夹ch1种只有2个文件,执行cmake命令后再次调用ls命令可以看到该文件夹下多了很多文件夹和文件,如下
调用命令make生成可执行文件,如下,图中可以看到生成了绿色的helloslam文件(可执行文件)
cmake 过程处理了工程文件之间的关系,而make 过程实际调用了g++ 来编译程序。虽然这个过程中多了调用cmake 和make 的步骤,但我们对项目的编译管理工作,从输入一串g++ 命令,变成了维护若干个比较直观的CMakeLists.txt 文件,这将明显降低维护整个工程的难度。比如,当我想新增一个可执行文件时,只需在CMakeLists.txt 中添加一行“add_executable”命令即可,而后续的步骤都是不变的。cmake 会帮我们解决代码的依赖关系,无需我们输入一大串g++ 命令。
此部分为另外一种生成hello程序功能的方法,故需要将之前的文件全部清空,即工作目录ch1下为空。
在一个C++ 工程中,并不是所有代码都会编译成可执行文件。只有带有main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西,供其他程序调用。这个东西叫做库。一个库往往是许多算法、程序的集合。
在Linux 中,库文件分成静态库和共享库两种¬。静态库以.a 作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间
A 在ch1目录下利用vim闯将文件libhelloslam.cpp,并添加代码如下:
B 使用vim创建文件CMakeLists.txt,并添加如下代码
C 使用mkdir命令创建build目录,用于存放产生的一系列文件,如下
D 进入build文件夹,并调用cmake命令创建工程,如下
E 在ch1目录下调用make,生成库文件,如下,可以看到多出了一个文件 libhello.a
方法步骤与静态库文件基本相同,唯一不同的是在CMakeLists.txt文件中声明不一样,如下是共享库文件声明方法
注意到:我们并没有注释掉静态库的声明,因为:2种库文件的生成互不影响,只要2种类型库文件的名字不一样即可,本例中静态库文件名字为hello,而共享库文件名字为hello1.
其他步骤与静态库文件一样,成功生成后如下:
库文件是一个压缩包,里头带有编译好的二进制函数。不过,仅有.a 或.so 库文件的话,我们并不知道它里头的函数到底是什么,调用的形式又是什么样的。为了让别人(或者自己)使用这个库,我们需要提供一个头文件,说明这些库里都有些什么。因此,对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库了
A 利用vim在工作目录ch1下创建libhelloslam.h,并添加如下代码
B.利用vim在ch1目录下生成usehello.cpp,如下:
C.在CMakeLists.txt文件中添加可执行程序的生成命令,同时添加库文件的链接声明
D.在build文件夹中调用cmake和make,生成可执行程序usehello
集成开发环境(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. 无须付费。
Kdevelop。它是一个免费软件,在Ubuntu 的源中提供,这意味着你可以用apt-get 来安装它
输入sudo apt-get install kdevelop进行安装
输入kdevelop打开,打开后界面如下
a 点击上方的工程,选择从模版新建
b.在创建新工程界面添加相应信息
c 点击上图中的next按钮,进行下一步
d 点击finish按钮,完成工程的创建
图中:第一栏是cmake命令的可执行程序目录;第二栏是本程序的编译运行目录,点击ok完成创建
生成成功后结果图如下
本工程使用库文件来输出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库的链接
点击界面上的构建按钮,或者直接按F8,相当于输入了cmake和make命令
a.执行程序前需要确保2步,其一就是已经点击过构建按钮(即已经正确编译链接,即cmake和make命令都执行成功,记住:只要make clean过工程,就需要重新构建);其二在点击execute按钮时需要指定启动器,即添加可执行程序的路径,如下
点击execute按钮,如果是第一次运行(或者使用过make clean,或清理过该工程)都会弹出配置启动器的对话框,如下
上图中选中工程名字helloslam, 然后点击新建,会自动弹出我们可执行程序的路径,如下,点击ok完成
再次点击界面上的execute按钮,成功执行
错误信息如下所示时,请仔细检查自己的CMakeLists.txt文件
笔者报上述错误原因如下,即工程名中间多了一个空格,去掉空格后即正常建立工程
出现错误如图,此错误为找不到usehello.cpp中包含的头文件。
解决方法:确保此头文件【libhelloslam.h】在ch1目录情况下,查看usehello.cpp中include语句,正确的include语句如下:
笔者错误的include语句如下:注意引号和尖括号的区别
补充:引号和尖括号的include语句区别如下:
include有两种形式:
1,#include " *.h":表示先在当前工程目录下查找头文件,如果没有再按标准方式查找;这种方式常用于用户自定义头文件的查找。
2,#include<*.h>:表示按标准方式查找头文件,即直接到系统指定的某些目录中去找某些头文件。
出现以下错误,则表示在CMakeLists.txt文件中忘记了将库文件链接到可执行程序上,即忘记写target_link_libraries(可执行程序名字 库文件名字)
出现以下错误,表示忘记在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文件 生成可执行文件】