ubuntu18.04 简单搭建C/C++ 编程环境
一.首先需要安装gcc和g++环境
安装之前查看是否有安装,使用命令:
gcc --version
g++ --version
Ubuntu 18.04中gcc与g++默认安装的是7.4.0版本。
如果没有或需要其他版本可以使用以下命令安装其他版本的gcc与g++:
sudo apt install gcc -5
sudo apt install g++ -5
或在Terminal中执行sudo apt-get install build-essential
二.安装vim 以及vim的使用
sudo apt-get install vim
vim d的基本使用
三.编写源码:
可以通过任何文本编辑器创建一个.cpp的文件.在这里用创建一个hello.cpp文件,并保存在一个文件中,测试的代码为:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world" << endl;
return 0;
}
四.gcc/g++ 编译连接过程:
1.编译hello.cpp
g++ -c hello.cpp
输出结果是一个hello.o文件,这是编译过程的生成的中间文件。-c 表示只编译,不链接。
2.链接hello.o生成hello.out
g++ -o hello.out hello.o
输出结果是一个hello.out文件,这是最终的可执行文件。-o 表示输出文件,hello.o是上一步生成的.o文件。
如果编译连接可以合并执行,直接执行命令
g++ -o hello.out hello.cpp
运行hello.out,最后执行以下hello.out验证一下输出结果呗
./hello.out
一步到位:
// 命令格式:g++ 文件名 默认输出文件是a.out
g++ 文件名 -o 输出文件名 指定输出文件名
对于g++的命令使用,可以通过:man g++命令查看
安装 vscode
方式一:图像界面安装
在Ubuntu 软件中心中,搜索Visual Studio Code, 一键安装;
方式二.命令安装
官网下载 vscode合适版本
我的系统是 Ubuntu18.04 64 位 ,
下载包:code_1.43.2-1585036376_amd64.deb
1.双击安装包,自动跳转到软件应用 界面安装即可
2.cd 到安装包文件夹:
sudo dpkg -i code_1.24.1-1528912196_amd64.deb
安装如果出现依赖问题可以执行apt --fix-broken install ,用来自动修复安装出现broken的package,然后重新安装
修改成中文:
进入 vscode 界面,按 ctrl+shift+p(搜索快捷键,记住它之后常用到) ,在输入框输入“language”选择Configure Display Language (配置显示语言)
英文配置选择"en"
中文配置"zh-CN"
vscode 配置C/C++ 开发环境
1.安装 C/C++ 插件
通过左边栏的Extension栏目,或者快捷键ctrl+shift+x 找到Extensions,搜C++,选且只选第一个扩展
其他插件可以自行安装,比如 code runner ,中文语言包,Python。。。
2.建立工程
由于VScode是以文件夹的形式管理工程的,因此我们首先新建一个文件夹,我这里取名叫hello
然后通过VScode打开此文件夹:
vscode 中关于工作区的介绍
新建 main.cpp文件并输入测试程序:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
cout << "Hello, world!!!!" << endl;
return 0;
}
3.更改配置文件(launch.json)
点击左侧的Debug按钮,选择添加配置(Add configuration),然后选择C++(GDB/LLDB),将自动生成默认launch.json文件 如下:
这里需要将program项的内容改为调试时运行的程序,改为
“program”: “
f
i
l
e
D
i
r
n
a
m
e
/
{fileDirname}/
fileDirname/{fileBasenameNoExtension}.out”,即可
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "build",//也就是添加一个launch之间的任务,任务名为build,这个build就是我们在tasks.json中设置的任务名。
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
添加构建(编译、链接等)任务(tasks.json):这个文件用来方便用户自定义任务,为了方便在VScode里编译C++代码,我们可以将类似g++ -g main.cpp等g++命令写入VScode的任务系统。
按快捷键shift+ctrl+p弹出命令面板,然后输入并进入Tasks: Configure Default Build Task(任务:配置默认生成任务)→ 使用模版创建Tasks.json文件 → Others:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": ["-g", "${file}", "-std=c++11", "-o", "${fileBasenameNoExtension}.out"]
}
]
}
这里的label为任务名,我们将”label"= “echo"改为”label”= “build”。
由于我们的指令是g++,这里将”command“=”echo Hello“改为”command“=”g++“。
然后添加g++的参数args。
如果我们的g++指令为:g++ -g main.cpp,这里可以把args参数设置为:
"args": ["-g", "${file}"]
如果我们想配置g++指令为:g++ -g main.cpp -std=c++11 -o main.out,则args参数可设置为:
"args": ["-g", "${file}", "-std=c++11", "-o", "${fileBasenameNoExtension}.out"]
配置launch.json和tasks.json的后保存, F 5 即可运行hello_world。
通过使用coderunner来配置C++ 编译环境
安装插件 Code Runner
code runner的原理就是自动帮你完成在控制台中输入切换路径和编译源代码以及运行编译好的程序的指令,不同语言对应一条指令,运行code runner根据指令在控制台执行根据模板生成的命令行指令,简单的说code runner只是帮你复制粘贴了一遍命令而已,自己手动输命令一样的。
其实CodeRunner做的事情就是cd到文件所在的目录;执行编译命令;执行结果
编译指令是根据配置文件中一开始写好的模板来执行的:
不同语言对应一条指令,运行Code Runner根据“根据指令”在控制台执行“根据模板”生成的命令行指令 如:
cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt
实际执行就是切换(cd指令)到源文件所在路径,编译(g++)源文件,输入(-o参数)成对应文件名的可执行文件
修改指令:
如果要换用某个语言的编译器,需要安装好并且设置好环境变量,之后再修改一下Code Runner插件的指令模板
依次找到:文件>首选项>设置>用户设置>扩展>run code configurate>Executor Map
然后点击在setting.json中编辑
输入
"code-runner.executorMap":{
"javascript": "node",
"java": "cd $dir ; javac $fileName ; java $fileNameWithoutExt",
"c": "cd $dir ; gcc $fileName -o $fileNameWithoutExt ; $dir$fileNameWithoutExt",
"cpp": "cd $dir ; g++ $fileName -o $fileNameWithoutExt ; ./$fileNameWithoutExt",
"objective-c": "cd $dir ; gcc -framework Cocoa $fileName -o $fileNameWithoutExt ; $dir$fileNameWithoutExt",
"php": "php",
"python": "python -u",
"perl": "perl",
"perl6": "perl6",
"ruby": "ruby",
"go": "go run",
"lua": "lua",
"groovy": "groovy",
"powershell": "powershell -ExecutionPolicy ByPass -File",
"bat": "cmd /c",
"shellscript": "bash",
"fsharp": "fsi",
"csharp": "scriptcs",
"vbscript": "cscript //Nologo",
"typescript": "ts-node",
"coffeescript": "coffee",
"scala": "scala",
"swift": "swift",
"julia": "julia",
"crystal": "crystal",
"ocaml": "ocaml",
"r": "Rscript",
"applescript": "osascript",
"clojure": "lein exec",
"haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
"rust": "cd $dir ; rustc $fileName ; $dir$fileNameWithoutExt",
"racket": "racket",
"ahk": "autohotkey",
"autoit": "autoit3",
"dart": "dart",
"pascal": "cd $dir ; fpc $fileName ; $dir$fileNameWithoutExt",
"d": "cd $dir ; dmd $fileName ; $dir$fileNameWithoutExt",
"haskell": "runhaskell",
"nim": "nim compile --verbosity:0 --hints:off --run",
"lisp": "sbcl --script",
"kit": "kitc --run"
},
}
不同编译器对应的相应指令;
要注意的是 用户设置和工作区设置的范围不一致;如果一开始选择的不是用户设置而是工作区设置选的run code configurate的话,该设置只会对对应的工作区(文件路径)生效,而用户设置则会在全局范围内生效。
安装opencv
cmake_gui 安装:
参考https://blog.csdn.net/jindunwan7388/article/details/80397700
用终端直接输入命令操作:参考
https://www.jianshu.com/p/f646448da265
https://blog.csdn.net/Qzx9059/article/details/88680475
本人安装过程遇到很多问题,最大的问题是安装不上依赖包,原因是系统长时间禁止推荐 重要安全更新,依赖包无法自动解析安装,经过更新后能自动解析;
依赖包版本与opencv 3.0.0 版本,在cmake 过程中,缺啥补啥,之后通过降级 g++, gcc
7.4 到5版本。安装成功。
编译环境变量设置
首先将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加
/usr/local/lib
接下来配置库
sudo ldconfig
更改环境变量:
sudo gedit /etc/bash.bashrc
在文件后添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存退出,在运行下面的例程之前,需要重新开启终端来使配置生效。
或者保存,执行如下命令使得配置生效:
source /etc/bash.bashrc
sudo updatedb
配置完成
vscode配置opencv
配置vscode
配置opencv,其实主要就解决两个问题,一个是头文件包含,一个是库文件搜索。头文件包含在c_cpp_properties.json中解决,库文件包含则要继续修改task.json中的编译命令。
c_cpp_properties.json:
按ctrl+shift+p,输入edit,选择C/C++:edit configuration(json),会弹出c_cpp_properties.json。他是配置外部环境的。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include", //请确保你的opencv opencv2头文件夹安装在这个目录
"/usr/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
task.json
这里就要解决库文件搜索,也简单,直接修改编译命令,也就是task.json中的args参数:
"args": [
"-g", "-std=c++11", "${file}", "-o", "${fileBasenameNoExtension}.o",// 设置动态链接库
"-I", "/usr/local/include",
"-I", "/usr/local/include/opencv",
"-I", "/usr/local/include/opencv2",
"-L", "/usr/local/lib",
"-l", "opencv_core",
"-l", "opencv_imgproc",
"-l", "opencv_imgcodecs",
"-l", "opencv_video",
"-l", "opencv_ml",
"-l", "opencv_highgui",
"-l", "opencv_objdetect",
"-l", "opencv_flann",
"-l", "opencv_imgcodecs",
"-l", "opencv_photo",
"-l", "opencv_videoio"
],// 编译命令参数
"-I", "/usr/local/include/opencv",
"-I", "/usr/local/include/opencv2/opencv2",
要注意args中的这两个
测试
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
cout << "----------读摄像机内外参数----------"<< endl;
// exit(0);
Mat img=imread("/home/pc007/Desktop/red_color.jpg");
cv::imshow("image",img);
cv::waitKey();
return 0;
}
F5 启动调试,
结果如下:
编译过程中遇到过报错:
/tmp/ccudBcqD.o:在main函数中:
test.cpp :(。text + 0xc0 ):未定义的引用`cv :: imread(std :: string const& int)'
test.cpp :(。text + 0x11f):未定义的引用`cv :: _ OutputArray :: _ OutputArray :Mat&)'
test.cpp :(。text + 0x138):未定义的引用`cv :: _ InputArray :: _ InputArray(cv :: Mat const&)'
test.cpp :(。文本+ 0x158):未定义的引用`cv :: cvtColor(cv :: _ InputArray const& cv :: _ OutputArray const& int,int)'
test.cpp :(。text + 0x180):undefined reference到`cv :: _ InputArray :: _ InputArray(cv :: Mat const&)'
test.cpp :(。text + 0x1ca):未定义引用`cv :: imwrite(std :: string const& cv :: _ InputArray const& std :: vector< int,std :: allocator< int> const&)'
test.cpp :(。text + 0x241):未定义引用`cv :: namedWindow std :: string const& int;'
test.cpp :(。text + 0x291):未定义的引用`cv :: namedWindow(std :: string const& int)'
test。 cv:没有定义的引用`cv :: _ InputArray :: _ InputArray(cv :: Mat const&)'
test.cpp :(。text + 0x2ff) :imshow(std :: string const& cv :: _ InputArray const&)'
test.cpp :(。text + 0x32d):未定义的引用`cv :: _ InputArray :: _ InputArray(cv :: Mat const& ;)'
test.cpp :(。text + 0x361):未定义的引用`cv :: imshow(std :: string const& cv :: _ InputArray const&)'
test.cpp: (.text + 0x383):未定义的引用`cv :: waitKey(int)'
/tmp/ccudBcqD.o:在函数`cv :: Mat ::〜Mat()':
test cv :: fastFree(void *)'
/tmp/ccudBcqD.o:在函数`cv :: Mat :: operator = .cpp ::。 (cv :: Mat const&)':
test.cpp :( .text._ZN2cv3MataSERKS0 _ [_ ZN2cv3MataSERKS0 _] + 0x111):未定义对`cv :: Mat :: copySize(cv :: Mat const&)'
/tmp/ccudBcqD.o:在函数`cv :: Mat :: release()':
test.cpp :(。text._ZN2cv3Mat7releaseEv [_ZN2cv3Mat7releaseEv] + 0x47):未定义引用`cv :: mat :: deallocate()'
collect2:error:ld返回1退出状态
解决方案
这是一个链接器问题。尝试:
g ++ -o test_1 test_1.cpp`pkg-config opencv --cflags --libs`
g++ test.cpp `pkg-config --cflags --libs opencv` -o test
g++ `pkg-config --cflags opencv` -o test test.cpp `pkg-config --libs opencv`
code runner 中对应指令修改:
"cpp": "cd $dir ; g++ `pkg-config --cflags opencv` $fileName -o $fileNameWithoutExt `pkg-config --libs opencv` ; ./$fileNameWithoutExt"
看到这,若觉得对你有帮助,请记得点赞告诉我呀!
参考:https://blog.csdn.net/weixin_43374723/article/details/84064644#1cc_18
https://www.cnblogs.com/lidabo/p/5888997.html
https://blog.csdn.net/weixin_35477207/article/details/78165411
https://www.pianshen.com/article/7015181941/
https://www.jianshu.com/p/259a6140da9d
https://blog.csdn.net/Qzx9059/article/details/88680475
https://www.jianshu.com/p/6d3f4a30945d