1. 基本流程

【Linux c++实战】手把手教你在linux上从零搭建c++项目,并详细介绍Cmake(C++|Cmake|Ubuntu)
以hello world为例:

  1. 创建cpp文件,写好代码
#include<iostream>
int main()
{
    std::cout << "Hello World From CXX" << std::endl;
    return 0;
}
  1. 编译运行
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.txtCMake指导文件

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++通用)
插件:

  1. C/C+//必需
  2. Code Runner//必需
  3. C/C++ Snippets // 建议,提供一些常用的C/C++片段
  4. EPITECH C/C++ Headers // 建议,为C/C++文件添加头部(包括作者、创建和修改日期等),并为.h头文件添加防重复的宏
  5. File Templates // 建议,文件模板,可以自己添加文件模板
  6. GBKtoUTF8 // 建议,GBK编码文件转换为UTF-8
  7. Include Autocomplete // 建议,头文件自动补全
  8. 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"
        }
    ]
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐