使用dw做门户网站/制作网站费用

使用dw做门户网站,制作网站费用,出口外贸网站建设,网站建设每天需要做什么负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…

负载均衡式在线OJ

目录

负载均衡式在线OJ

1.项目介绍:

2.comm

2.1 log.hpp

日志等级

开放式日志

 时间戳工具

2.2 util.hpp

TimeUtil类

PathUtil类

FileUtil类

StringUtil类

3.Compile_server

3.1compile_run.hpp

RemoveTempFile

 CodeToDesc

 Start

 3.2compile.hpp

Compiler类

 3.3runner.hpp

Runner类

 4.oj_server

4.1 oj_control.hpp

Machine类

IncLoad

DecLoad

ResetLoad

Load

LoadBlance类

LoadConf

SmartChoice

OfflineMachine

OnlineMachine

Control类

RecoveryMachine

AllQuestions

Question

Judge

 4.2 oj_model

Question结构体

Model类

QueryMysql

GetAllQuestions

GetOneQuestion

依赖的外部模块

 4.3 oj_view

AllExpandHtml

 OneExpandHtml


1.项目介绍:

        该项目完成了类似力扣,牛客网等网站的在线OJ功能, 通过平衡负载函数,将所有用户发出的请求平均分配给每一台主机,做到负载均衡实现高并发、高可用性和高性能。

三个板块

comm : 时间戳生成、文件路径处理、文件读写操作以及字符串分割功能。
compile_server : 编译与运⾏模块
oj_server : 获取题目列表,查看题目编写题目界面,负载均衡等功能

开发环境 : C++、Ubuntu、vim、g++、gdb、git、Makefile

所用技术栈 : HTML、Json、STL标准库、Boost准标准库、cpp-httplib、ctemplate、MySQL

项目源码 :

2.comm

2.1 log.hpp

log.hpp定义了一个日志系统,可以进行日志等级,日志格式化,日志输出等功能,命名空间为ns_log。

日志等级

enum
{INFO,    // 信息级别日志DEBUG,   // 调试级别日志WARNING, // 警告级别日志ERROR,   // 错误级别日志FATAL    // 致命错误级别日志
};

开放式日志

使用方法 :   LOG(INFO) << "This is an info message" << "\n";

inline std::ostream &Log(const std::string &level, const std::string &file_name, int line)#define LOG(level) Log(#level, __FILE__, __LINE__)

 时间戳工具

TimeUtil::GetTimeStamp()

2.2 util.hpp

TimeUtil类

此类中共有两个接口,分别为GetTimeStamp(),用于获取当前时间的秒级时间戳,目的是为了给文件形成唯一的文件名,另外一个是GetTimeMs()获取当前时间的毫秒级时间戳。

static std::string GetTimeStamp()static std::string GetTimeMs()

PathUtil类

该类共有7个接口

AddSuffix:将文件名与后缀拼接,生成完整的文件路径 ;

Src: 构建源文件的完整路径,返回.cpp后缀的文件;

Exe:构建可执行文件的完整路径,添加.exe后缀

CompileError:构建编译错误文件的完整路径,添加.compile_error后缀

Stdin:构建标准输入文件的完整路径,添加.stdin后缀
Stdout:构建标准输出文件的完整路径,添加.stdout后缀

Stderr:构建标准错误文件的完整路径,添加.stderr后缀

static std::string AddSuffix(const std::string &file_name, const std::string &suffix)
static std::string Src(const std::string &file_name)
static std::string Exe(const std::string &file_name)
static std::string CompilerError(const std::string &file_name)
static std::string Stdin(const std::string &file_name)
static std::string Stdout(const std::string &file_name)
static std::string Stderr(const std::string &file_name)

FileUtil类

IsFileExists:检查文件是否存在,存在返回true,不存在返回false

static bool IsFileExists(const std::string &path_name)

UniqFileName:使用上述GetTimeMs函数获得唯一文件名

static std::string UniqFileName()

 WriteFile:将内容写入指定文件,target为目标文件路径,content为要写入的内容,写入成功为true

static bool WriteFile(const std::string &target, const std::string &content)

ReadFile: 读取文件的内容,target:目标文件路径,content:用于存储读取内容的字符串指针

static bool ReadFile(const std::string &target, std::string *content, bool keep = false)

StringUtil类

SplitString:将字符串按指定分隔符切分,并存储到target中,str:要切分的字符串,target:存储切结果的字符串向量,sep:切割符,该方法是基于Boost库实现的
 

static void SplitString(const std::string &str, std::vector<std::string> *target, const std::string &sep)

3.Compile_server

3.1compile_run.hpp

  • 编译用户代码: 将用户提交的代码编译为可执行文件。

  • 运行用户程序: 在限制的 CPU 时间和内存内运行用户程序。

  • 处理运行结果: 根据运行结果生成状态码和描述信息。

  • 清理临时文件: 在运行结束后清理生成的临时文件

RemoveTempFile

static void RemoveTempFile(const std::string &file_name)

该方法用于清理有指定文件名相关的临时文件。可用于清理以下文件:

源文件 (file_name.cpp)
编译错误文件 (file_name.compile_error)
可执行文件 (file_name.exe)
标准输入文件 (file_name.stdin)
标准输出文件 (file_name.stdout)
标准错误文件 (file_name.stderr)

 CodeToDesc

static std::string CodeToDesc(int code, const std::string &file_name)

该方法的作用是将状态码转换为描述信息

code:状态码,file_name:文件名  以下为状态码处理:

0: 编译运行成功。
-1: 提交的代码为空。
-2: 未知错误。
-3: 编译错误(从 file_name.compile_error 文件中读取错误信息)。
SIGABRT (6): 内存超过范围。
SIGXCPU (24): CPU 使用超时。
SIGFPE (8): 浮点数溢出。

 Start

static void Start(const std::string &in_json, std::string *out_json)

该方法:编译并运行用户提交的代码,返回运行结果
参数:in_json:输入的 JSON 字符串,包含用户代码、输入、CPU 时间限制和内存限制
out_json:输出的 JSON 字符串,包含状态码、描述信息、标准输出和标准错误

输入JSON格式:
{"code": "用户提交的代码","input": "用户输入","cpu_limit": "CPU 时间限制","mem_limit": "内存限制"
}输出JSON格式:
{"status": "状态码","reason": "描述信息","stdout": "标准输出","stderr": "标准错误"
}

解析输入 JSON,获取代码、输入、CPU 限制和内存限制。
检查代码是否为空,如果为空,设置状态码为 -1。
生成唯一的文件名,并将代码写入临时源文件。
调用 Compiler::Compile 编译代码:
如果编译失败,设置状态码为 -3。
调用 Runner::Run 运行编译后的程序:
如果运行失败,设置状态码为运行结果。
根据状态码生成描述信息。
如果运行成功,读取标准输出和标准错误文件的内容。
将结果写入输出 JSON。
(可选)清理临时文件 

所依赖的外部模块:

  • Compiler: 编译模块,负责将用户代码编译为可执行文件。

  • Runner: 运行模块,负责运行编译后的程序,并限制其 CPU 和内存使用。

  • ns_log: 日志模块,用于记录日志信息。

  • ns_util: 工具模块,提供文件、路径、时间等工具函数。

  • JsonCpp: 用于解析和生成 JSON 数据。

 3.2compile.hpp

Compiler类

Compile

static bool Compile(const std::string &file_name)

 使用 fork 创建子进程。
在子进程中:
打开编译错误文件(file_name.compile_error),用于存储编译错误信息。
使用 dup2 将标准错误输出重定向到编译错误文件。
使用 execlp 调用 g++ 编译器,将源文件(file_name.cpp)编译为可执行文件(file_name.exe)。
如果 execlp 失败,记录错误日志并退出。
在父进程中:
使用 waitpid 等待子进程结束。
检查是否生成了可执行文件(file_name.exe)。
如果生成成功,记录日志并返回 true;否则返回 false。

所依赖的外部模块:

  • ns_util: 工具模块,提供路径拼接和文件操作功能。

    • PathUtil::Src(file_name): 获取源文件路径(./temp/file_name.cpp)。

    • PathUtil::Exe(file_name): 获取可执行文件路径(./temp/file_name.exe)。

    • PathUtil::CompilerError(file_name): 获取编译错误文件路径(./temp/file_name.compile_error)。

    • FileUtil::IsFileExists(path): 检查文件是否存在。

  • ns_log: 日志模块,用于记录日志信息。

    • LOG(INFO): 记录信息日志。

    • LOG(WARNING): 记录警告日志。

    • LOG(ERROR): 记录错误日志

 3.3runner.hpp

Runner类

SetProcLimit接口

static void SetProcLimit(int _cpu_limit, int _mem_limit)

参数:_cpu_limit:CPU时间限制,_mem_limit:内存资源限制,设置进程的 CPU 和内存资源限制。

setrlimit 系统调用设置资源限制。RLIMIT_CPU: 限制 CPU 时间。RLIMIT_AS: 限制虚拟内存大小。

Run接口

运行编译后的程序,并限制其 CPU 和内存资源使用

static int Run(const std::string &file_name, int cpu_limit, int mem_limit)
  • > 0: 程序异常退出,返回值为收到的信号编号。

  • == 0: 程序正常运行完毕。

  • < 0: 内部错误(如文件打开失败或子进程创建失败)

  1. 获取可执行文件、标准输入、标准输出和标准错误的路径。

  2. 打开标准输入、标准输出和标准错误文件。

  3. 使用 fork 创建子进程。

  4. 在子进程中:

    • 使用 dup2 重定向标准输入、标准输出和标准错误。

    • 调用 SetProcLimit 设置资源限制。

    • 使用 execl 运行可执行程序。

    • 如果 execl 失败,记录错误日志并退出。

  5. 在父进程中:

    • 关闭文件描述符。

    • 使用 waitpid 等待子进程结束。

    • 获取子进程的退出状态,并返回状态码的低 7 位(信号编号)。

 依赖的外部模块

  • ns_util: 工具模块,提供路径拼接功能。

    • PathUtil::Exe(file_name): 获取可执行文件路径(./temp/file_name.exe)。

    • PathUtil::Stdin(file_name): 获取标准输入文件路径(./temp/file_name.stdin)。

    • PathUtil::Stdout(file_name): 获取标准输出文件路径(./temp/file_name.stdout)。

    • PathUtil::Stderr(file_name): 获取标准错误文件路径(./temp/file_name.stderr)。

  • ns_log: 日志模块,用于记录日志信息。

    • LOG(INFO): 记录信息日志。

    • LOG(ERROR): 记录错误日志。

 4.oj_server

4.1 oj_control.hpp

主要的功能:管理题目数据,渲染网面,负载均衡,调用编译和运行服务。

核心类

Machine:表示提供编译和运行服务的主机

LoadBlance:实现负载均衡

Control:核心业务逻辑处理器

 依赖模块

ns_model: 题目数据管理。

ns_view: HTML 渲染。

ns_log: 日志记录。

ns_util: 工具函数。

httplib: HTTP 客户端。

Machine类

IncLoad

void IncLoad()//增加主机负载,使用互斥锁保护负载变量,确保线程安全。

DecLoad

void DecLoad()//减少主机负载,使用互斥锁保护负载变量,确保线程安全。

ResetLoad

void ResetLoad()//重置主机的负载为0,使用互斥锁保护负载变量,确保线程安全

Load

uint64_t Load() //获取主机的当前负载,使用互斥锁保护负载变量,确保线程安全

LoadBlance类

LoadConf

bool LoadConf(const std::string &machine_conf)

 从配置文件中加载主机信息,参数:machine_conf:配置文件路径

读取配置文件,解析每台主机的 IP 和端口。初始化主机对象,并将其加入在线主机列表。

SmartChoice

bool SmartChoice(int *id, Machine **m)

参数:id 输出型参数返回选择的主机ID, m:输出参数,返回选择的主机的对象指针。
遍历在线主机列表,选择负载最低的主机

OfflineMachine

void OfflineMachine(int which)//将指定主机离线

which为要离线的主机ID

OnlineMachine

void OnlineMachine()//将所有离线主机全部上线

ShowMachine

void ShowMachines()//打印当前在线和离线主机列表(用于调试)。

Control类

核心业务逻辑控制器,负责管理题目数据、渲染网页、负载均衡以及调用编译和运行服务。

RecoveryMachine

void RecoveryMachine()//恢复离线主机为在线状态

AllQuestions

bool AllQuestions(string *html) //获取所有题目数据并渲染为网页。

html:输出参数,返回渲染后的HTML内容

从Model获取所有题目数据,使用View渲染题目列表为HTML

Question

bool Question(const string &number, string *html)//获取指定题目数据并渲染为网页

number: 题目编号。html: 输出参数,返回渲染后的 HTML 内容。

Judge

void Judge(const std::string &number, const std::string in_json, std::string *out_json)

参数:number:题目编号,in_json:输入的JSON数据,out_json:输出的JSON数据,包含评测数据

从 Model 获取指定题目的详细信息。
解析输入 JSON,拼接用户代码和测试用例代码。
使用负载均衡选择主机,发起 HTTP 请求调用编译和运行服务。
将评测结果写入输出 JSON。

 所依赖的外部模块

  • ns_model: 提供题目数据管理功能。

    • GetAllQuestions: 获取所有题目数据。

    • GetOneQuestion: 获取指定题目数据。

  • ns_view: 提供 HTML 渲染功能。

    • AllExpandHtml: 渲染题目列表为 HTML。

    • OneExpandHtml: 渲染题目详情为 HTML。

  • ns_log: 提供日志记录功能。

  • ns_util: 提供工具函数(如字符串分割)。

  • httplib: 提供 HTTP 客户端功能,用于调用编译和运行服务。

 4.2 oj_model

Question结构体

变量名类型描述
numberstd::string题目编号,唯一标识
titlestd::string题目标题
starstd::string题目难度(简单、中等、困难)
descstd::string题目描述
headerstd::string题目预设代码(用户编辑器的初始代码)
tailstd::string题目测试用例(与 header 拼接形成完整代码)
cpu_limitint题目时间限制(单位:秒)
mem_limitint题目空间限制(单位:KB)

Model类

QueryMysql

bool QueryMySql(const std::string &sql, vector<Question> *out)//执行 SQL 查询,并将结果存储到 out 中。

sql:要执行的SQL查询语句,out:输出参数,存储查询结果的Question向量

GetAllQuestions

bool GetAllQuestions(vector<Question> *out)

构造 SQL 查询语句:SELECT * FROM oj_questions

调用 QueryMySql 执行查询

GetOneQuestion

bool GetOneQuestion(const std::string &number, Question *q)

构造 SQL 查询语句:SELECT * FROM oj_questions WHERE number=<number>。
调用 QueryMySql 执行查询。
如果查询结果中有且仅有一条记录,将其赋值给 q。

依赖的外部模块

  • ns_log: 提供日志记录功能。

    • LOG(INFO): 记录信息日志。

    • LOG(WARNING): 记录警告日志。

    • LOG(FATAL): 记录致命错误日志。

  • ns_util: 提供工具函数。

  • mysql.h: MySQL C API 头文件,用于连接和操作 MySQL 数据库。

// 以下是硬编码的常量const std::string oj_questions = "oj_questions"; // 数据库表名const std::string host = "127.0.0.1";           // MySQL 服务器地址const std::string user = "oj_client";           // MySQL 用户名const std::string passwd = "123456";            // MySQL 密码const std::string db = "oj";                    // 数据库名称const int port = 3306;                          // MySQL 服务器端口号

 4.3 oj_view

AllExpandHtml

void AllExpandHtml(const vector<struct Question> &questions, std::string *html)

question:题目列表,包含所有题目的详细信息,html:输出参数,存储渲染后的html内容。

  1. 构造模板文件路径:./template_html/all_questions.html

  2. 创建 ctemplate::TemplateDictionary 对象 root,用于存储模板数据。

  3. 遍历题目列表,将每个题目的编号、标题和难度添加到模板数据中。

  4. 加载模板文件。

  5. 使用模板数据渲染 HTML 页面,并将结果存储到 html 中。

 OneExpandHtml

q:单个题目的详细信息,html:输出参数存储渲染后的html内容

  1. 构造模板文件路径:./template_html/one_question.html

  2. 创建 ctemplate::TemplateDictionary 对象 root,用于存储模板数据。

  3. 将题目的编号、标题、难度、描述和预设代码添加到模板数据中。

  4. 加载模板文件。

  5. 使用模板数据渲染 HTML 页面,并将结果存储到 html 中。

 所依赖的外部模块

ctemplate: 用于 HTML 模板渲染。

ctemplate::TemplateDictionary: 存储模板数据。
ctemplate::Template: 加载和渲染模板文件。
ns_model: 提供题目数据管理功能。
Question: 题目数据结构,包含编号、标题、难度、描述、预设代码等信息。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始用AI开发游戏(一)

1. 核心玩法设计 核心目标&#xff1a;玩家需在随机生成的3D迷宫中寻找出口&#xff0c;躲避陷阱、收集道具、解开谜题。核心机制&#xff1a; 随机生成迷宫&#xff1a;每次游戏生成不同结构的迷宫&#xff08;递归分割算法或深度优先搜索&#xff09;。第一人称视角&#xf…

基于ssm的宠物医院信息管理系统(全套)

一、系统架构 前端&#xff1a;html | layui | vue | element-ui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页…

cursor使用

引入私有文档 设置-> Features->下滑找到Docs url后边多加一个 / 可以拉取url下所有的页面(子页面&#xff0c;子目录)&#xff0c;不加只拉取url当前页面 使用 选择 Docs 回车 选择 文档 直接解析链接 链接 回车 搜索引擎 web 对比git版本差异 git 选择其中一个 g…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

【C++项目实战】校园公告搜索引擎:完整实现与优化指南

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、项目概述 &#x1f4d6;1.项目背景 &#x1f4d6;2.主要功能 &#x1f4d6;3.界面展…

MySQL数据库复制

文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库&#xff0c;支撑它如此出彩的因素主要有两个&am…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统&#xff0c;结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势&#xff0c;为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能&#xff0c;还拥有一个漂亮且…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

最完美的WPF无边框设计!

常规的无边框方法设计 常规的WPF无边框设计方法都是通过AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome样式来实现,但是这样会有问题就是,窗体最大化的时候将底部任务栏给挡住了,另外最大化的时候不能拖动窗体。参考这个大佬的设计@ 若…

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…

32单片机——LED

LED原理图如图所示&#xff1a; 代码 DS0和DS1每过500ms一次交替闪烁&#xff0c;实现类似跑马灯的效果 GPIO输出配置步骤 &#xff08;1&#xff09;使能对应GPIO时钟 STM32在使用任何外设之前&#xff0c;我们都要先使能其时钟&#xff08;下同&#xff09;。本实验用到…

贪心算法和遗传算法优劣对比——c#

项目背景&#xff1a;某钢管厂的钢筋原材料为 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 种规格 &#xff0c;现用贪心算法和遗传算法两种算法进行计算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…

【Java篇】一法不变,万象归一:方法封装与递归的思想之道

文章目录 Java 方法的使用&#xff1a;从基础到递归的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定义1.3 方法调用的执行过程1.4 实参和形参的关系1.5 没有返回值的方法 二、方法重载2.1 为什么需要方法重载2.2 方法重载的概念2.2.4 C 和 Java 的比较&…

实验5 逻辑回归

实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本&#xff0c;使用逻辑回归算法进行参数估计&#xff0c;并画出分类边界 【实验要求】写明实验步骤&#xff0c;必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…

思维训练让你更高、更强 |【逻辑思维能力】「刷题训练笔记」假设法模式逻辑训练题(1-5)

每日一刷 思维训练让你更高、更强&#xff01; 题目1 谁在说谎&#xff0c;谁拿走了零钱&#xff1f; 姐姐上街买菜回来后&#xff0c;就随手把手里的一些零钱放在了抽屉里&#xff0c;可是&#xff0c;等姐姐下午再去拿钱买菜的时候发现抽屉里的零钱没有了&#xff0c;于是&…

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

【Python】dash-fastapi前后端搭建

概述 项目中需要快速搭建一个前后端系统&#xff0c;涉及到dash-fastapi架构的时候&#xff0c;对该架构的时候进行总结。本文主要总结的是对该架构的基本使用&#xff0c;后续再对该架构的项目源码进行总结分析 此处实现一个小的demo&#xff0c;迷你任务管理器&#xff0c;…

IDEA中链接使用mysql数据库

一、连接mysql 1. 打开idea&#xff0c;在右上角侧边栏有数据库database插件&#xff0c;打开侧边栏点击加号->数据源&#xff0c;可以看到支持很多数据库&#xff0c;选择mysql。 2. 首次使用需要下载驱动程序&#xff0c;不然连接数据库会报错。找到mysql&#xff0c;点击…

程序编译生成的文件

目录 .i 文件 .s 文件 .o文件 总结 在 C 编程中&#xff0c;.i、.s和 .o 文件是编译过程中生成的不同阶段的文件&#xff0c;它们代表不同的含义&#xff1a; .i 文件 全称 &#xff1a;预处理后的文件&#xff08;Intermediate File&#xff09;。 含义&#xff1a;.i文件…