一、CMakeLists.txt
项目组织目录如图:
CMakeLists.txt文件可以按照下面这样写:
# 1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.10.2)
# 2.指定项目的名称,一般和项目的文件夹名称对应,声明一个cmake工程,工程名为IMUtest
PROJECT(IMUtest)
# 3.设置编译器编译模式,对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
set( CMAKE_BUILD_TYPE "Debug")
# 4.添加引用的头文件,此项目main.cpp引用的头文件有serialport.h,因此需要添加头文件目录,因为和CMakeList.txt同级,所以此处目录只写include即可,应写对头文件所在的目录,以防找不到相应的头文件而报错,如果难以确定就直接写上绝对路径即可
include_directories(include) #其实头文件也可以放在源文件所在的文件夹中,这样就不用添加此命令,但是为了整个工程的简洁干净便于管理,所以建议放到include文件夹中。
# 也可以将include_directories全部大写,INCLUDE_DIRECTORIES(include)
# 5.src下面有两个.cpp需要编译,相应的库函数也都有,这个时候可以执行下面的步骤
# 将源文件目录/路径 src赋值给DIR_SRCS
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
# 6.添加要编译的可执行文件,编译main.cpp,生成可执行文件名称是main,也可以写成${PROJECT_NAME},即为当前项目名称IMUtest
add_executable(main {DIR_SRCS})
#5和6也可以合在一起写,添加要编译的所有源文件,源文件少可以这样写
# add_executable(main src/main.cpp src/serialport.cpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
也可以将serialport.cpp编译成动态链接库libserialport.so,此时CMakeLists.txt文件可以按照下面这样写:
# 1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.10.2)
# 2.指定项目的名称,一般和项目的文件夹名称对应,声明一个cmake工程,工程名为IMUtest
PROJECT(IMUtest)
# 3.设置编译器编译模式,对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
set( CMAKE_BUILD_TYPE "Debug")
# 4.添加引用的头文件,此项目main.cpp引用的头文件有serialport.h,因此需要添加头文件目录,因为和CMakeList.txt同级,所以此处目录只写include即可,应写对头文件所在的目录,以防找不到相应的头文件而报错,如果难以确定就直接写上绝对路径即可
include_directories(include) #其实头文件也可以放在源文件所在的文件夹中,这样就不用添加此命令,但是为了整个工程的简洁干净便于管理,所以建议放到include文件夹中。
# 也可以将include_directories全部大写,INCLUDE_DIRECTORIES(include)
# 5.编译生成库文件,下面命令把源文件serialport.cpp编译成名字为“serialport”的共享库libserialport.so
add_library(serialport SHARED src/serialport.cpp)
# 6.添加要编译的可执行文件,编译main.cpp,生成可执行文件名称是main,也可以写成${PROJECT_NAME},即为当前项目名称IMUtest
add_executable(main src/main.cpp)
# 7.add link library,添加可执行文件所需要的库,比如main用到了libserialport.so,添加该库的名称
target_link_libraries(main serialport) #可执行文件main链接到共享库文件库libSum.so,可执行程序即可调用库文件中的函数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
新建build文件夹,在build文件夹执行Cmake,make就可以成功编译并生成可执行文件
mkdir build
cd build
cmake ..
make
在build文件夹下生成动态库libserialport.so和可执行文件main
如果项目中用到了第三方库,如opencv库,则首先需要安装opencv库,安装参考下面的博客,亲测无报错
博客地址:
https://www.cnblogs.com/booturbo/p/17399215.htmlhttps://www.cnblogs.com/booturbo/p/17399215.html
上面的博客中配置opencv环境时,使用gedit编辑
sudo gedit /etc/profile.d/pkgconfig.sh
在pkgconfig.sh添加环境变量并执行生效命令后下一步检查发现没有添加成功,可以改用vi编辑,输入下面的命令:
sudo vi /etc/profile.d/pkgconfig.sh
按i启用编译,加入环境变量后按:,再输入wq!保存并退出
用到opencv的项目CMakeLists.txt文件可以按照下面这样写:
# 1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.10.2)
# 2.指定项目的名称,一般和项目的文件夹名称对应,声明一个cmake工程,工程名为IMUtest
PROJECT(IMUtest)
# 3.设置编译器编译模式,对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
set( CMAKE_BUILD_TYPE "Debug")
# 4.添加引用的头文件,此项目main.cpp引用的头文件有serialport.h,因此需要添加头文件目录,因为和CMakeList.txt同级,所以此处目录只写include即可,应写对头文件所在的目录,以防找不到相应的头文件而报错,如果难以确定就直接写上绝对路径即可
include_directories(include) #其实头文件也可以放在源文件所在的文件夹中,这样就不用添加此命令,但是为了整个工程的简洁干净便于管理,所以建议放到include文件夹中。
# 也可以将include_directories全部大写,INCLUDE_DIRECTORIES(include)
# 5.编译生成库文件,下面命令把源文件serialport.cpp编译成名字为“serialport”的共享库libserialport.so
add_library(serialport SHARED src/serialport.cpp)
#查找依赖包,理想情况下,find_package能把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到
find_package(OpenCV REQUIRED)
# 输出相关信息
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
# 6.添加要编译的可执行文件,编译main.cpp,生成可执行文件名称是main,也可以写成${PROJECT_NAME},即为当前项目名称IMUtest
add_executable(main src/main.cpp)
# 7.add link library,添加可执行文件所需要的库,比如main用到了libserialport.so,添加该库的名称
target_link_libraries(main serialport) #可执行文件main链接到共享库文件库libSum.so,可执行程序即可调用库文件中的函数
target_link_libraries(main ${OpenCV_LIBS}) #链接opencv库
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
二、VSCode配置文件
配置第一步:卸掉run code插件,只针对单个文件且不依赖其他库的情况下点击一下就运行才好用,当编译多个文件或者引用了其他库的时候迅速卸载!!!!
三个配置文件
1.c_cpp_properties.json,内容如下:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
//opencv包含路径,告诉编译器头文件在哪里,添加后源文件中包含opencv头文件不会有红线
"/usr/local/include/opencv4"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
2.launch.json,负责调试的文件,内容如下
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
//debug要用的可执行文件的路径及名称,要与task.json中生成的保持一致
"program": "${workspaceFolder}/build/main",
"args": ["para1", "para2"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
//启用调试要预先处理的任务:在task.json里面定义有两个任务
//一个是使用g++的g++ build;一个是使用cmake的cmake build
"preLaunchTask": "cmake build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
3.tasks.json
{
"version": "2.0.0",
"tasks": [
//-----------------------cmake build任务------------------------------//
//下面这段相当于在 “项目目录/build” 路径下去执行"Cmake .."命令,
//".."是因为CMakeLists.txt是在项目目录下
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args":[
".."
],
"options": {
"cwd": "${workspaceFolder}/build"
}
},
//下面这段相当于在 “项目目录/build” 路径下去执行"make"命令
{
"label": "make",
"type": "shell",
"command": "make",
"args":[
""
],
//make要依赖于Cmake生成的Makefile文件,所以这里要依赖于cmake
"dependsOn": [
"cmake"
],
"options": {
"cwd": "${workspaceFolder}/build"
}
},
//定义cmake build任务,它依赖于make,而make又依赖于cmake
{
"label": "cmake build",
"dependsOn": [
"make"
]
},
//----------------------------------g++ build任务-----------------------------------//
{
"label": "g++ build",
"type": "cppbuild",
"command":"g++",
"args": [
"-g",
//下面是编译的源文件,根据实际情况进行修改
"${file}",
"-o",
//下面是生成的可执行文件的路径及名称,“项目目录/build” 路径下生成main
//g++默认的是在XX.cpp目录下生成名为XX的可执行文件,而cmake默认的是在执行目录下生成main
"${workspaceFolder}/build/main",
//下面是依赖的opencv头文件和库,使用下面这条代码需要对opencv进行配置
"`pkg-config --libs --cflags opencv4`"
//也可以手动添加opencv的头文件和库目录,库用了几个加几个,不够优雅,比如:
/*
"-I","/usr/local/include/opencv4"
"-L","/usr/local/lib"
"/usr/local/lib/用到的opencv库名"
*/
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher":[
"$gcc"
],
"group":"build",
"detail":"compiler:/usr/bin/g++"
}
],
}
三个文件配置好以后,就可以优雅地运行或者调试代码了
(1)选择配置的任务cmake build,就会在build文件夹下生成可执行文件和makefile等一堆文件,跟上面的“新建build文件夹,在build文件夹执行Cmake,make就可以成功编译并生成可执行文件”效果一模一样
(2)选择配置的任务g++ build,就会在build文件下生成可执行文件main