1、编译多个c++文件
主要参考这个链接,但是因为vocode中配置编译多个c++文件的json不好配置,所以还是按照终端输入命令的方法编译整个工程,不同的是终端借用vscode的终端,这样在调试的时候可以看到自己的代码,更加方便。在根目录执行cmake .以及make操作,生成的可执行文件在build目录下(在cmakelists里面设置),在build目录下执行进行gdb调试(在本项目中,执行的是gdbmain),然后设置断点(如 b main),再继续往下调试(r,n,s等命令),本质上还是在终端操作,但是个人感觉这样还是方便一点,虽然还是没有借助vscode进行调试,不能直观的看到各个变量的值,不能监视变量。
最后附上一张在vscode中实际操作的截图:
2、添加依赖库
在 cmake 的编译体系中,package 用来指代一个依赖库,包括一些头文件、动态库、静态库等等,在 CMakeFileLists.txt 中通过 find_package()命令可以很轻易实现。
比如很多同学可能会用 OpenCV 进行图像开发,它是个非常有名的开源库,它有 10 来个库文件、几十个头文件,因此如何正确引用它就是一件值得小心翼翼的事情,但好在 cmake 可以轻松搞定这件事情。
前提条件,你的 PC 上已经完全安装好了 OpenCV
DisplayImage.cpp
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv )
{
if ( argc != 2 )
{
printf("usage: DisplayImage.out <Image_Path>\n");
return -1;
}
Mat image;
image = imread( argv[1], 1 );
if ( !image.data )
{
printf("No image data \n");
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}
下面是 CMakeFileLists.txt
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
然后就可以编译了。
mkdir build
cd build
cmake ..
make
./DisplayImage ../lena.jpg
程序就可以运行。
这个例子是 OpenCV 的官方示例。
下面需要说明的是,find_package(OpenCV REQUIRED)执行成功后,它的头文件路径,库文件路径都会被赋值。
OpenCV_INCLUDE_DIRS 是头文件路径
OpenCV_LIBS 是库文件地址
有了头文件和库文件,自然而然可以正常引用 OpenCV 了。
package 的通用套路
实际上,通过 find_package() 可以顺利查找任何符合 cmake package 标准的外部工程。
find_pacage()方法签名如下:
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
QUITE 参数指代,当查找出错时,屏蔽 message() 的输出。
REQUIRED 参数指代,当找不到 package 时,终止过程。
现在用 XXX 代表要查找的 package 名字
find_pacakge(XXX REQUIRED)会设置一系列变量。
XXX_FOUND 代表库是否查找成功
XXX_INCLUDE_DIRS 代表头文件的路径
XXX_LIBRARIES 代表库文件的路径