Linux下怎样编译通过使用C++17新特性的代码?

简介: 以下为示例:通过c++17的新特性实现对文件的读取。
  1. 需要有环境 [[Linux怎样更新Centos下Gcc版本支持C17?]]
  2. 代码需要在编译时指定 c++版本
  3. 如果使用多线程和锁,要加-pthread
  4. 使用文件系统类,需要额外的编译选项 -lstdc++fs
  5. 不需要额外指定动态库或者静态库地址,filesystem类包含在了libstdc++.so中
-rw-r--r-- 1 root root 4887654 Mar 27  2020 libstdc++.a
-rw-r--r-- 1 root root 1520198 Mar 27  2020 libstdc++fs.a
-rw-r--r-- 1 root root 1928418 Mar 27  2020 libstdc++_nonshared.a
-rw-r--r-- 1 root root     210 Mar 27  2020 libstdc++.so


以下为示例:通过c++17的新特性实现对文件的读取。


源码

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <filesystem>
#include <thread>
#include <mutex>
using namespace std;
namespace fs = std::filesystem;
class FileScanner
{
public:
    FileScanner(string path, bool recursive = true, bool parallel = false)
        : path_(path), recursive_(recursive), parallel_(parallel) {}
    map<string, string> search()
    {
        map<string, string> result;
        vector<thread> threads;
        mutex m;
        if (parallel_)
        {
            for (auto &p : fs::recursive_directory_iterator(path_))
            {
                if (!fs::is_directory(p))
                {
                    threads.emplace_back([&]()
                                         {
                        auto file_path = p.path().string();
                        auto file_name = p.path().filename().string();
                        ifstream file(file_path);
                        if (file) {
                            string content((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
                            lock_guard<mutex> lock(m);
                            result[file_name] = content;
                        } });
                }
            }
        }
        else if (recursive_)
        {
            for (auto &p : fs::recursive_directory_iterator(path_))
            {
                if (!fs::is_directory(p))
                {
                    auto file_path = p.path().string();
                    auto file_name = p.path().filename().string();
                    ifstream file(file_path);
                    if (file)
                    {
                        string content((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
                        result[file_name] = content;
                    }
                }
            }
        }
        else
        {
            for (auto &p : fs::directory_iterator(path_))
            {
                if (!fs::is_directory(p))
                {
                    auto file_path = p.path().string();
                    auto file_name = p.path().filename().string();
                    ifstream file(file_path);
                    if (file)
                    {
                        string content((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
                        result[file_name] = content;
                    }
                }
            }
        }
        if (parallel_)
        {
            for (auto &thread : threads)
            {
                thread.join();
            }
        }
        return result;
    }
private:
    string path_;
    bool recursive_;
    bool parallel_;
};
int main()
{
    FileScanner scanner("path/to/your/directory", true, true);
    map<string, string> result = scanner.search();
    for (auto &item : result)
    {
        cout << item.first << " : " << item.second << endl;
    }
    return 0;
}


编译方式:

g++ ReadFileDemo-4.cpp -std=c++17 -lstdc++fs -pthread -g -o Read_Test-4

目录
相关文章
|
1天前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
9天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
40 16
|
27天前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
54 25
为什么C/C++编译腰要先完成汇编
|
2月前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
283 14
|
3月前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
171 2
|
3月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
91 4
|
3月前
|
自然语言处理 编译器 Linux
|
3月前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
112 0
|
3月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
4月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
145 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库