Linux构建C++环境
编译多个文件的古老方法就是编写makefile,用于说明各个c++文件的依赖关系,然后用一款make软件来构建程序,make会用到makefile文件(需手动编写)和g++编译器。头文件(.h)都放到include文件夹,源文件(.cpp)包括main.cpp都放到src文件夹。主要含义就是:把include文件夹当作头文件目录,把src当成源文件目录,使用c++11的标准。因此更现代的构建工具c
1. 基本流程
【Linux c++实战】手把手教你在linux上从零搭建c++项目,并详细介绍Cmake(C++|Cmake|Ubuntu)
以hello world为例:
- 创建cpp文件,写好代码
#include<iostream>
int main()
{
std::cout << "Hello World From CXX" << std::endl;
return 0;
}
- 编译运行
g++ hello.cpp -o hello_cpp
./hello_cpp
2. 用CMake构建工程
安装cmake:
ubantu:apt-get install cmake 或 sudo apt install camke
centos用yum
2.1 建立工程目录(自己手动新建文件夹)
标准的工程目录:
文件夹 | 说明 |
---|---|
include | 存放头文件(.h)每个c++程序通常都由头文件(.h)和源文件组成(.cpp) |
src | 存放源文件(.cpp) |
build | 存放构建生成时生成的临时文件、可执行文件 |
CmakeLists.txt | CMake指导文件 |
2.2 编写CmakeLists
编译多个文件的古老方法就是编写makefile,用于说明各个c++文件的依赖关系,然后用一款make软件来构建程序,make会用到makefile文件(需手动编写)和g++编译器。
然而makefile的规则很复杂。因此更现代的构建工具cmake应运而生。
cmake主要分为三步:
①先编写Cmake指导文件CmakeLists.txt
②用Cmake生成makefile文件
③make构建工程
需要关注的是CmakeLists.txt,其编写如下:
# 项目名称
project (sunnet)
# CMake最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 头文件目录
include_directories(include)
# 查找./src目录下的所有源文件,保存到DIR_SRCS变量
aux_source_directory(./src DIR_SRCS)
# 用C++11
add_definitions(-std=c++11)
# 指定生成目标文件
add_executable(sunnet ${DIR_SRCS})
# 库文件
find_package (Threads)
target_link_libraries (sunnet ${CMAKE_THREAD_LIBS_INIT})
主要含义就是:把include文件夹当作头文件目录,把src当成源文件目录,使用c++11的标准
2.3 编写项目文件
头文件(.h)都放到include文件夹,源文件(.cpp)包括main.cpp都放到src文件夹
2.4 编译运行
切换至bulid文件夹,执行编译命令
cd build
cmake ../
make
最终运行成功后就会在build文件夹中看到这些内容:
sunset 是对应的可执行文件。
运行:得到对应结果
./sunnet
3. 集成开发环境(IDE)
Linux 下常用的 C/C++ IDE 还是比较多的;主要有qtcreator、vscode、clion。
切记:编译C++时要使用g++编译,使用gcc可能会有一些链接和定义的问题出现
3.1 qtcreator
3.2 VSCode
linux环境下基于VSCode配置多目录C/C++编译调试环境
vscode编译多文件的方法(C和C++通用)
插件:
- C/C+//必需
- Code Runner//必需
- C/C++ Snippets // 建议,提供一些常用的C/C++片段
- EPITECH C/C++ Headers // 建议,为C/C++文件添加头部(包括作者、创建和修改日期等),并为.h头文件添加防重复的宏
- File Templates // 建议,文件模板,可以自己添加文件模板
- GBKtoUTF8 // 建议,GBK编码文件转换为UTF-8
- Include Autocomplete // 建议,头文件自动补全
- One Dark Pro // 建议,可以打造好看的VS Code主题
launch.json文件:
{
// 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", // 配置类型,这里只能为cppdbg
"request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
"program": "${fileDirname}/${fileBasenameNoExtension}.out", // 将要进行调试的程序的路径
"args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,我一般设置为true
"cwd": "${workspaceFolder}", // 调试程序时的工作目录
"environment": [],
"externalConsole": false, // 调试时是否显示控制台窗口,一般设置为true显示控制台,
// 但是最新版cpptools有BUG,具体请看文末的注意
"internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
"MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
"miDebuggerPath": "gdb", // 调试器路径,Windows下后缀不能省略,Linux下则去掉
"setupCommands": [ // 用处未知,模板如此
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
}
]
}
task.json:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
"command": "g++", // 要使用的编译器, C就写gcc
"args": [
"${file}",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
"${fileDirname}/${fileBasenameNoExtension}.out",
"-g", // 生成和调试有关的信息
//"-Wall", // 开启额外警告
"-static-libgcc", // 静态链接
"-std=c11" // C语言最新标准为c11,或根据自己的需要进行修改比如C++17
], // 编译命令参数
"type": "shell", // 可以为shell或process,前者相当于先打开shell再输入命令,后者是直接运行命令
"group": {
"kind": "build",
"isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
},
"presentation": {
"echo": true,
"reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
"focus": true, // 设为true后可以使执行task时焦点聚集在终端
"panel": "shared" // 不同的文件的编译信息共享一个终端面板
},
//"problemMatcher": "$gcc"
}
]
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)