开发环境
开发环境选择window10+Visual Studio Code + ubuntu20.64 虚拟机
一Windows 安装
1.安装git for windows
安装过程直接下一步。
主要原因是windows OpenSSH在vs code 下不可用, 安装后需要在环境变量的path/path配置一下git
2.安装Visual Studio Code
安装过程直接下一步。
3.vscode 安装插件
1 Remote Development
2 C/C++ Themes
3 C/C++ for Visual Studio Code
4 WSL ( Windows Subsystem for Linux )
以上都是必须安装的,否则调试的时候提示cppdbg错误
二 Ubuntu安装
安装编译环境
sudo apt-get install build-essential
安装ssh gdb gdbserver服务
sudo apt-get install openssh-server gdb gdbserver
启动ssh服务
sudo service ssh start
查询ssh服务是否启动
sudo service ssh status
三 vscode连接到ubuntu
略
四 ubuntu工作区文件目录
建立第一级目录
建立XDEV或者其他,包含_Bin,_Include两个目录,_Bin为输出路径,所有本项目的so,out都输出到该目录一下。
建立工程目录
考虑工程目录可能跨平台使用,故建立如图所示目录,目前只有_Linux有效,如图所示
其中:
_Linux放Makefile
_Win32放VC++工程文件
src放代码文件.cpp .h
Makefile编写.
参考网上例子,我编写以下通用模板,可以同时编译动态库,可执行文件,包括debug,release,如编译debug只需在编译指定debug=y 例如 make debug=y
CROSS=
CC:=$(CROSS)gcc
CXX:=$(CROSS)/usr/bin/g++
#****************************************************************************
# Include paths
#****************************************************************************
INCS :=-I../../_Include/
#****************************************************************************
# Libs
#****************************************************************************
LIBS:=
#EX:
#LIBS:= -L/home/ubuntu/workzt/ffmpegTomp4/aarch64_lib/ -lavformat -lavcodec -lavfilter -lswscale -lavutil -lswresample -lavdevice -lm -pthread
#****************************************************************************
# Out path paths
#****************************************************************************
OUT_PATH:=../../_Bin/
#****************************************************************************
# Target filename
#****************************************************************************
FILENAME:=libxkernel
#****************************************************************************
# Target file ext-name
#****************************************************************************
EXTNAME:=.so
#****************************************************************************
# ggc args
#****************************************************************************
CFLAGS:=-Wall -O0 -DNDEBUG -Wno-unknown-pragmas -Wno-format -Wno-missing-braces -Wno-maybe-uninitialized -Wno-unused-but-set-variable
#****************************************************************************
# g++ args
#****************************************************************************
CXXFLAGS:=-w -std=c++11 -O0 -DNDEBUG -Wno-unknown-pragmas -Wno-format -Wno-missing-braces -Wno-maybe-uninitialized -Wno-unused-but-set-variable
#****************************************************************************
# debug options
#****************************************************************************
ifeq ($(debug), y)
$(warning builid as debug)
CFLAGS += -g
CXXFLAGS+= -g
FILEFULLNAME:=$(FILENAME)d$(EXTNAME)
#if debug xxx.xx->xxxd.xx
else
$(warning builid as release)
FILEFULLNAME:=$(FILENAME)$(EXTNAME)
endif
#****************************************************************************
# lib or app
#****************************************************************************
ifeq ($(EXTNAME), .so)
$(warning builid as lib)
CXXFLAGS += -shared
CXXFLAGS += -fPIC
else
$(warning builid as app)
endif
#****************************************************************************
# Source files
#****************************************************************************
#SRCS:=$(wildcard ../src/*.cpp)
#SRCS+=$(wildcard ../src/*.c)
SRCS_ALL:=$(shell find ../src -name "*.cpp" -o -name "*.c")
#过滤的文件,指定哪些源文件不需要编译
FilterFiles_CPP :=
FilterFiles_C :=
FilterFiles := $(FilterFiles_C) $(FilterFiles_CPP)
FilterFiles := $(addprefix %/,$(FilterFiles))
SRCS := $(filter-out $(FilterFiles), $(SRCS_ALL))
#定义宏
DEF=
#****************************************************************************
# Objects
#****************************************************************************
OBJ:=$(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SRCS)))
#****************************************************************************
# Target
#****************************************************************************
TARGET = $(OUT_PATH)$(FILEFULLNAME)
PHONY : all clean
all: $(TARGET)
$(TARGET):$(OBJ)
$(CXX) $(CXXFLAGS) -o $@ $(OBJ) $(LIBS)
%.o : %.c
echo "compiling $< ..."
echo $(TARGET)
@($(CC) -fPIC -c $(CFLAGS) $(INCS) $(LIBS) $< -o $@)
%.o : %.cpp
$(CXX) -fPIC -c $(CXXFLAGS) $(DEF) $(INCS) $(LIBS) $< -o $@
clean :
@echo "remove temp files(obj)..."
@rm $(OBJ)
@echo "Compilation succeeded! out file is:" $(TARGET)
五 vscode 工作区配置
tasks.json
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
//
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "make file",
"command": "make",
"args": [],
"options": {
"cwd": "${workspaceFolder}/_Linux"
//指定Makefile所在的路径
},
"group": "build"
},
{
"type": "shell",
"label": "make file debug",
"command": "make",
"args": [
"debug=y"
//指定debug模式
],
"options": {
"cwd": "${workspaceFolder}/_Linux"
//指定Makefile所在的路径
},
"group": "build"
},
{ //删除二进制文件
"type": "shell",
"label": "delete output file",
"command": "rm",
"args": [
"${fileDirname}/${fileBasenameNoExtension}"
],
"presentation": {
"reveal": "silent", //删除过程不切换终端(专注程序输出)
}
}
]
}
tasks.json文件 task数组包含3个元素,分别为编译release,编译debug,和删除临时文件。
launch.json
tasks.json修改完毕后,我们要在launch.json 建立对于的任务,配置如下。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
//使用MAKEFILE
"name": "make file debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/../_Bin//eglshowbmpd.out",
"args": [],
"stopAtEntry": false,
"cwd": "/home/111/XDEV/_Bin",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "make file debug",
"miDebuggerPath": "/usr/bin/gdb"
},
{
//使用MAKEFILE
"name": "make file",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/../_Bin//eglshowbmp.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "make file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
其中重要的参数为:
name:这与task.json->label中一一对应,必须准确
program:可执行文件路径,如果使用相对路径,只能使用${workspaceFolder}/…/,特别注意使用相对路径远程调试时会提示找不到文件,建议使用绝对路径,如/HOME/XXX/XDEV
cwd:工作路径,建议使用绝对路径
到此,环境搭建完毕,下一篇使用FFMEPG解码