跳转至

C++

Windows 的配置灾难

众所周知,在windows上安装VSCode并配置好mingw编译器对于很多新手来说都是一件非常曲折的事情。 因为 Windows 的主要受众是普通人,所以软件管理,编译器配置方面都不如Linux便利。

如果你选择了 Linux ,那么恭喜你将获得一个非常便利而自然的开发环境。 接下来我简单介绍一下如何在 Linux 上跑通一个 简单的 Hello World 以及多文件编译。

g++ 安装

g++ 编译器是专门用于编译 cpp 代码的(也就是让你写的东西能用机器跑起来)。 安装非常简单,取决于你使用什么包管理器。

  • Debian 系(Ubuntu, Mint, Debian)
sudo apt install g++ -y
  • 红帽系(Fedora, rhel, rocky)
sudo dnf install g++ -y
  • Arch系
sudo pacman -S g++ -y
  • 查看版本
g++ -v

参考输出: ❯ g++ -v

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodi
r=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-gcc-major-version-only --with-linker-hash-style=gnu --with-system-zl
ib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-s
erialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-fixincludes --disable-libssp --disable-libstdcxx-pch --disable-werror
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 16.1.1 20260725 (GCC)

编写一个程序

  • 创建一个cpp文件(以cpp为后缀)
touch hello.cpp
  • 使用你喜欢的编辑器打开
vim hello.cpp
# 如果你不会用 vim 就用nano
# nano hello.cpp
  • 写入下面的内容
#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
    return 0;
}
  • 保存并退出

  • 编译成二进制文件

g++ hello.cpp -o hello

-o Place the output into . 这里 -o 表示 output(输出的二进制文件), 后面跟上你起的二进制文件名, 随便叫啥,一般会叫main或者你的程序名。

写法是 g++ 源文件路径 -o 二进制文件。

  • 运行程序
./hello # ./ 表示当前目录, 后面直接跟上文件名, 表示运行该二进制文件

这个时候终端会打印 hello world, 恭喜你成功用命令行成功编写并运行了一个C++程序。

多文件编译

当我们的源文件不止一个的时候, 我们需要在编译的时候把所有用到的源文件都写上(当然仅限于自己写的那些源文件,标准库就不需要了)。

比如说这个项目:

 tree
.
├── CMakeLists.txt
├── compile_commands.json
├── include
│   ├── legacy
│      ├── CommentIO.hpp
│      ├── Filter.hpp
│      ├── LegacyFilterPipeline.hpp
│      └── NaiveScanner.hpp
│   ├── lib
│      ├── csv.hpp
│      └── simdutf.h
│   └── localLib
│       ├── BloomDeduplicator.hpp
│       ├── Comment.hpp
│       ├── CommentInteractiveInput.hpp
│       ├── CsvCommentInput.hpp
│       ├── CsvUtil.hpp
│       ├── Deduplicator.hpp
│       ├── FilterPipeline.hpp
│       ├── HammingDeduplicator.hpp
│       ├── ICommentSource.hpp
│       ├── Matrix.hpp
│       ├── mini_test.h
│       ├── PathUtil.hpp
│       ├── Recorder.hpp
│       ├── SlidingWindowLimiter.hpp
│       ├── Trie.hpp
│       ├── WatchMode.hpp
│       ├── WordAppender.hpp
│       ├── WordLibarary.hpp
│       └── WorkPerformaceAnalyser.hpp
├── makefile
├── src
│   ├── main.cpp
│   └── simdutf.cpp

不要看有这么多文件, 但是这个明显是一个 header only 的项目, 只有 src/ 目录里面有两个cpp 文件,所以我们只需要编译的时候指定这两个即可。

# 创建一个 bin 目录放产物 如果你还没有的话
mkdir -p bin

g++ src/simdutf.cpp src/main.cpp -o bin/main
# 当然我们有更好的策略, 我们使用的可是高贵的Linux
# g++ src/* -o bin/main
# 直接使用通配符编译所有的cpp文件

这里给个建议就是将cpp源文件和hpp头文件分开,这样方便管理。

现在你已经学会如何使用命令行编译cpp程序了,当然还有各种的编译方式,有各种编译工具,但是入门的话现在这些知识就够了。 祝贺你。