1.Qt:靠谱点了!获取获基于WebAssembly开发网页端
2.djangoç¨ä»ä¹ç¼è¾å¨
3.Qt中嵌入web网页的网页网页几种实现方式
4.onvif库封装及qt工程调用onvif库实现设备搜索、获取码流地址等功能
5.请问什么是源码内核头文件(kernelheaders)、工具链(toolchai
Qt:靠谱点了!数据基于WebAssembly开发网页端
Qt for WebAssembly技术,获取获于年发布,网页网页视频裂变后台源码旨在让Qt程序直接运行在web端。源码通过使用Emscripten静态编译Qt工程并打包成wasm可执行文件,数据配合html套壳加载至浏览器中,获取获实现Qt程序在浏览器本地上运行。网页网页与WebGL等技术相比,源码此方法在性能和效果上更为可靠。数据为了深入理解此技术,获取获建议参考Qt官方文档,网页网页获取详细资料。源码
欲通过WebAssembly开发程序,建议先阅读相关链接,以节省时间,构建满意工程。系统准备推荐使用Ubuntu . bit,并使用虚拟机安装,以避免环境问题。Qt源码下载地址为,摇签源码 php, jsp, examplesæ件该å æåæ·è´å°staticç®å½ä¸ï¼ç±äºKindEditoræ¯jsæ件æäºç¼è¾å¨ï¼æ以就设置äºjs/editorç®å½ï¼å¹¶å°KindEditor代ç æ·è´å°è¯¥ç®å½ä¸ãå°±åè¿æ ·åstatic/js/editor/kindeditor-4.1.7ã
2ãå¨ææ¬è¾å ¥åçhtmlä¸æ·»å è¿è¡KindEditor ç¸å¯¹åºçJavarScriptå¨å®ç½ç使ç¨è¯´æä¸å¯ä»¥çå°ã
3ãå¨html页é¢å å ¥ä»¥ä¸èæ¬ï¼
4ãå建kindeditorçï¼å¨kindeditor-4.1.7ç®å½ä¸å建åºconfig.jsæ件ãtextareaçidç»éadminåï¼æ¥çå ç´ å³å¯è·åã
//config.js
KindEditor.ready(function(K) {
window.editor = K.create('#id_content',{
// æå®å¤§å°
width:'px',
height:'px',
});
});
#admin.py
from django.contrib import admin
from kindeditor.models import Article
# Register your models here.
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title',)
class Media:
# å¨ç®¡çåå°çHTMLæ件ä¸å å ¥jsæ件, æ¯ä¸ä¸ªè·¯å¾é½ä¼è¿½å STATIC_URL/
js = (
'js/editor/kindeditor-4.1.7/kindeditor-all.js',
'js/editor/kindeditor-4.1.7/lang.zh_CN.js',
'js/editor/kindeditor-4.1.7/config.js',
)
å¼åpythonç¨åºç¨å¥ç¼è¾å¨
1ãSublime Text
Sublime Textæ¯æå¤åè½ï¼èä¸å¨å¼åè 社åºé常å欢è¿ãSublime Textæèªå·±çå 管çå¨ï¼å¼åè å¯ä»¥ä½¿ç¨TAæ¥å®è£ ç»ä»¶ï¼æ件åé¢å¤çæ ·å¼ï¼ææè¿äºé½è½æåä½ çç¼ç ä½éªã
Sublime Textæ¯è¾éåpythonæ°æ使ç¨ï¼æ¯å¼åè ä¸ææµè¡çç¼è¾å¨ä¹ä¸ãSublime Textæ¯æ跨平å°ãå¤ç§è¯è¨ï¼èä¸å¯ä»¥ä½¿ç¨å ¶ä¸°å¯çæ件å主é¢ã
ä¼ç¹ï¼è½»ä¾¿ãæå¼é度快ãå®ç¾æ¯æä¸æã
缺ç¹ï¼éè¦æ¶è´¹ï¼æ´æ°æ ¢ï¼å¦æä¸ä»è´¹ï¼ç»å¸¸è·³åºè´ä¹°é¡µé¢ã
2ãPycharm
Pycharmæ¯JetBrainså¼åçPython IDEãPycharmæ¥æä¸è¬IDEå ·å¤çåè½ï¼æ¯å¦ï¼è°è¯ãè¯æ³é«äº®ãProject管çã代ç 跳转ãæºè½æ示ãèªå¨å®æãåå æµè¯ãçæ¬æ§å¶â¦â¦è¿æä¾äºä¸äºå¾å¥½çåè½ç¨äºDjangoå¼åï¼åæ¶æ¯æGoogle App Engineï¼æ´é ·çæ¯ï¼pycharmæ¯æIronPythonã
ä¼ç¹ï¼å¥½ç¨ãåè½å ¨é¢ï¼ä¸ç¨æ å¿ç¯å¢é ç½®çé®é¢ã
缺ç¹ï¼å¯¹æ§è½è¦æ±è¾é«ï¼ç¤¾åºçä¸æ¯æè¿ç¨å¼ååè½ãæ°æ®åºæ¯æ以å对webå¼åæ¡æ¶çæ¯æççã
3ãVim
Vimæ¯viåå±èæ¥çææ¬ç¼è¾å¨ï¼ä»£ç è¡¥å ¨ãç¼è¯åé误跳转çæ¹ä¾¿ç¼ç¨çåè½ç¹å«ä¸°å¯ï¼å¨ç¨åºåä¸è¢«å¹¿æ³ä½¿ç¨ãåEmacs并åæ为类Unixç³»ç»ç¨æ·æå欢çç¼è¾å¨ã
Vimåè½å¼ºå¤§ï¼æ件ç§ç±»ä¼å¤ï¼å ·æé«åº¦çå®å¶åãå¦æä½ çç»ä½¿ç¨Vimçè¯ï¼é£ä¹ä½ å®å ¨å¯ä»¥è±ç¦»é¼ æ ï¼åæå¨é®çä¸åå¼¹é¢ç´ä¸æ ·ã
ä¼ç¹ï¼å¯ä»¥è±ç¦»é¼ æ ãæçé«ã
缺ç¹ï¼ä»£ç æ示没ævscodeçå¤åå ¨ï¼æ³¨écsså注éhtmlä¸æ ·ï¼åªä¸è¿æå ¥çæ¯/* å */ã
pythonç¨ä»ä¹ç¼è¾å¨æ¯è¾å¥½ï¼ï¼ï¼ç¬¬ä¸ï¼Sublime TextSublime
Textè½»é级ç代ç ç¼è¾å¨ï¼è·¨å¹³å°ï¼æ¯æå åç§ç¼ç¨è¯è¨ï¼å æ¬PythonãJavaãCãC++çï¼å°å·§çµæ´»ãè¿è¡è½»å¿«ï¼æ¯æ代ç é«äº®ãèªå¨è¡¥å ¨ãè¯æ³æ示ï¼æ件æ©å±ä¸°å¯ï¼æ¯ä¸ä¸ªé常ä¸éç代ç ç¼è¾å¨ï¼é ç½®ç¸å ³æ件åï¼å¯ç´æ¥è¿è¡Pythonç¨åºãSublime
Textæ¯å¼åè ä¸ææµè¡çç¼è¾å¨ä¹ä¸ï¼å¤åè½ãæ¯æå¤ç§è¯è¨ï¼æ·±åå¼åè çå欢ã
第äºãVS Code
VS Codeæ¯å¾®è½¯å¼åçä¸ä¸ªè·¨å¹³å°ç代ç ç¼è¾å¨ï¼æ¯æ常è§çç¼ç¨è¯è¨å¼åï¼æ件æå±ä¸°å¯ï¼ä¸ä» æºè½è¡¥å ¨ãè¯æ³æ£æ¥ã代ç é«äº®ï¼è¿æ¯ægitåè½ï¼è¿è¡æµç ï¼æ¯ä¸æ¬¾é常å欢è¿ç代ç ç¼è¾å¨ï¼å®è£ ç¸å ³æ件ä¹åï¼ä¹å¯ä»¥ç´æ¥è¿è¡Pythonç¨åºã
第ä¸ãAtom
Atomæ¯githubä¸é¨ä¸ºç¨åºåå¼åçä¸ä¸ªä»£ç ç¼è¾å¨ï¼ä¹æ¯è·¨å¹³å°çï¼çé¢ç®æ´ç´è§ï¼ä½¿ç¨èµ·æ¥é常æ¹ä¾¿ï¼èªå¨è¡¥å ¨ã代ç é«äº®ãè¯æ³æ示ãå¯å¨è¿è¡é度è¾å¿«ï¼å¯¹äºåå¦è æ¥è¯´ï¼ä½¿ç¨èµ·æ¥é常ç®åã
第åãPyCharm
PyCharmæ¯ä¸ä¸ªä¸é¨ç¨äºPythonå¼åçIDEï¼å¸¸è§çåè½æï¼ä»£ç è¡¥å ¨ãæºè½æ示ãè¯æ³æ£æ¥ï¼è¿ä¸ªè½¯ä»¶é½æ¯æãé¤æ¤ä¹å¤ï¼è¿éæäºçæ¬æ§å¶ãåå æµè¯ãgitåè½ï¼å¯ä»¥å¿«éå建DjangoãFlaskçPython Webæ¡æ¶ï¼ä½¿ç¨èµ·æ¥é常ä¸éï¼å¨å¼å大å项ç®ä¸ç»å¸¸ä¼ç¨å°ï¼å¯ä¸ç缺ç¹æ¯ï¼å¯å¨èµ·æ¥æ¯è¾å¡ï¼è¿ä¸æ¯å è´¹çï¼ä¸è¿å¯ä»¥ä¸è½½ç¤¾åºå è´¹ççã
第äºï¼Vim
Vimå¯ä»¥è¯´æ¯Pythonæ好çIDEãVimæ¯é«çº§ææ¬ç¼è¾å¨ï¼æ¨å¨æä¾å®é çUnixç¼è¾å¨ï¼Viåè½ï¼æ¯ææ´å¤æ´å®åçç¹æ§éãVimä¸éè¦è±è´¹å¤ªå¤çå¦ä¹ æ¶é´ï¼ä¸æ¦ä½ éè¦ä¸ä¸ªæ ç¼çç¼è¾ä½éªï¼é£ä¹å°±ä¼æViméæå°ä½ çå·¥ä½æµä¸ã
第å ï¼Eclipse with PyDev
Eclipse with PyDevæ¯é常æµè¡çIDEï¼èä¸å·²ç»æå¾ä¹ çåå²äºãEclipse with PyDevå 许å¼åè å建æç¨å交äºå¼çWebåºç¨ãPyDevæ¯Eclipseå¼åPythonçIDEï¼æ¯æPythonãJythonålronPythonçå¼åã
第ä¸ï¼Emacs
GNU Emacsæ¯å¯æ©å±ï¼èªå¨ä»¥çææ¬ç¼è¾å¨ï¼çè³ææ´å¤çåè½ãEmacsçæ ¸å¿æ¯Emacs Lisp解æå¨ï¼ä½æ¯æ¯æææ¬ç¼è¾ãå¦æä½ å·²ç»ä½¿ç¨è¿Vimï¼å¯ä»¥å°è¯ä¸ä¸Emacsã
ç¬¬å «ï¼Komodo Edit
Komodo Editæ¯ä¸æ¬¾é常干åèä¸ä¸ä¸çPython IDEã
第ä¹ï¼Wing
WingçPythonIDEå ¼å®¹Python2.xå3.xï¼å¯ä»¥ç»åDjangoãmatplotlibãZopeãPloneãAPP EngineãPyQtåå ¶ä»Pythonæ¡æ¶ä½¿ç¨ãWingæ¯ææµè¯é©±å¨å¼åï¼éæäºåå æµè¯ï¼noseåDjangoæ¡æ¶çæ§è¡åè°è¯åè½ãWing IDEå¯å¨åè¿è¡çé度é½é常快ï¼æ¯æWindowsãLinuxãOS XåPython versiã
第åï¼PyScripter
PyScripteræ¯ä¸æ¬¾å è´¹ãå¼æºçPythonéæå¼åç¯å¢ã
第åä¸ï¼The Eric Python IDE
Ericæ¯å ¨åè½çPythonåRubyç¼è¾å¨åIDEï¼æ¯ä½¿ç¨Pythonç¼åçãEricåºäºè·¨å¹³å°çGUIå·¥å ·å QTï¼éæäºé«åº¦çµæ´»çScintillaç¼è¾å¨æ§ä»¶ï¼Ericå æ¬ä¸ä¸ªæ件系ç»ï¼å 许ç®åç对IDEè¿è¡åè½æ§æ©å±ã
第åäºï¼IEP
IEPæ¯è·¨å¹³å°çPython IDEï¼æ¨å¨æä¾ç®åé«æçPythonå¼åç¯å¢ï¼å æ¬ä¸¤ä¸ªéè¦çç»ä»¶ï¼ç¼è¾å¨åshellï¼å¹¶ä¸æä¾æä»¶å·¥å ·éä»å个æ¹é¢æ¥æé«å¼å人åçæçã
python-djangoä¸ä½¿ç¨ckeditorå¯ææ¬ï¼åå°æ²¡é®é¢ï¼åå°ä¸ºä»ä¹ä¸å¥½ä½¿ï¼é¦å 说ä¸ä¸å¯ææ¬ç¼è¾å¨çåçï¼å¯ææ¬ç¼è¾å¨ä¸è¬é½æ¯éè¿jsæ件å®ç°çï¼ç±»ä¼¼äºä¸ä¸ªç½é¡µæ§ä»¶ãå¨djangoåå°ä¹æ以å¯ä»¥è°ç¨å¯ææ¬ç¼è¾å¨ï¼é£æ¯å 为å®å¯ä»¥æ ¹æ®è¿ä¸ªå¯ææ¬ç¼è¾å¨å®ä¹çå段ï¼æ¾å°å¯¹è¡çjsæ件ï¼ç¶åå¨åå°æ¨¡æ¿éè°ç¨è¿ä¸ªjsæ件ãèä½ ç´æ¥éè¿ç»æ¨¡æ¿ä¼ é对åºçå½æ°ï¼æ¨¡æ¿æ件è½ç¶å¯ä»¥è¯å«å°å¯¹åºçå½æ°ï¼ä½æ¯æ æ³å 载对åºçjsæ件ï¼èªç¶æ æ³å¨ç½é¡µä¸åå§åè¿ä¸ªå¯ææ¬ç¼è¾å¨çæ§ä»¶ã
å æ¤ï¼å¯¹åºç解å³åæ³æ¯æ¥ä¸ä¸ckeditorè¿ä¸ªç¼è¾å¨çå端è°ç¨æ¹å¼ï¼æ£å¸¸æ åµä¸ä¸è¬æ¯ç»ä½ éè¦æå ¥å¯ææ¬ç¼è¾å¨çç¼è¾æ¡è®¾ç½®ä¸ä¸ªckeditor对åºçç±»ï¼ç¶åå¨æ¨¡æ¿æ件ä¸ä½¿ç¨script/scriptæ ç¾æ¥å¯¼å ¥ckeditoréè¦çjsæ件以åå ¶ä»éè¦å¯¼å ¥çéææ件ï¼å°±å¯ä»¥äºã
ä¸ç¥éæè®²æ¸ æ¥äºæ²¡æï¼å¸æå¯ä»¥å¸®å©å°ä½ ã
pythonç¨ä»ä¹ç¼è¾å¨ç¬¬ä¸æ¬¾ï¼Sublime Text
Sublime Textæ¯ä¸ä¸ªä»£ç ç¼è¾å¨ï¼ä¹æ¯HTMLåæ£æå è¿çææ¬ç¼è¾å¨ãSublime Textæ¯ç±ç¨åºåJon Skinneräºå¹´1æ份æå¼ååºæ¥ï¼å®æå被设计为ä¸ä¸ªå ·æ丰å¯æ©å±åè½çVimã
Sublime Textå ·ææ¼äº®çç¨æ·çé¢å强大çåè½ï¼ä¾å¦ä»£ç 缩ç¥å¾ï¼Pythonçæ件ï¼ä»£ç 段çãè¿å¯èªå®ä¹é®ç»å®ï¼èååå·¥å ·æ ã
Sublime Textç主è¦åè½å æ¬ï¼æ¼åæ£æ¥ï¼ä¹¦ç¾ï¼å®æ´çPython APIï¼Gotoåè½ï¼å³æ¶é¡¹ç®åæ¢ï¼å¤éæ©ï¼å¤çªå£ççãSublime Textæ¯ä¸ä¸ªè·¨å¹³å°çç¼è¾å¨ï¼åæ¶æ¯æWindowsãLinuxãMac OS Xçæä½ç³»ç»ã
第äºæ¬¾ï¼Geany
Geanyæ¯ä¸ä¸ªå°å·§ç使ç¨GTK+2å¼åç跨平å°çå¼æºéæå¼åç¯å¢ï¼ä»¥GPL许å¯è¯ååæºä»£ç ï¼æ¯å è´¹çèªç±è½¯ä»¶ã
Geanyå°å·§ãå¯å¨è¿ éï¼æ¥æè¯æ³é«äº®ã代ç èªå¨è¡¥å®ã代ç æå ãæ件æ©å±ãèªå¨è¡¥å®ç»å¸¸ä½¿ç¨çç»æãè°ç¨æ示çåè½ï¼æ¯æCãJavaãPHPãhtmlãPythonãperlãpascalçè¯è¨ï¼å¯¹å¼åè èè¨æ¯ä¸æ¬¾ç¸å¯¹ç®ä¾¿çå·¥å ·ã
ç»è¯ï¼ä»¥ä¸å°±æ¯é¦å¸CTOç¬è®°ä¸ºå¤§å®¶ä»ç»çå ³äºdjangoç¨ä»ä¹ç¼è¾å¨çå ¨é¨å 容äºï¼å¸æ对大家ææ帮å©ï¼å¦æä½ è¿æ³äºè§£æ´å¤è¿æ¹é¢çä¿¡æ¯ï¼è®°å¾æ¶èå ³æ³¨æ¬ç«ã
Qt中嵌入web网页的几种实现方式
Web网页的界面交互相较于Qt客户端拥有较大优势,能提供丰富且便捷的用户体验,使得在客户端中嵌入web网页成为可能。这能结合web的优势与客户端特性,丰富界面功能。本文将介绍几种Qt客户端中嵌入web网页的实现方式及步骤。基于Qt自带控件实现
Qt内置的控件用于访问网页,集成webkit内核与google引擎,类似简易版浏览器。此方案在Qt5.9.6中采用QWebEngineView。环境配置:Qt5.9.6 + VS
检查webenginewidgets模块是否配置成功。
开发流程:通过拖拽控件或直接new使用,代码示例与效果展示。
总结:实现简单,但浏览器内核不支持视频解码,需编译源码解决,成本较高。
嵌入Chrome.exe进程实现
此方法启动本地Chrome浏览器,实现与本地浏览器功能等同。通过启动浏览器进程并传入参数,再获取窗口句柄,实现嵌入。环境配置:Qt5.9.6 + VS
检测Chrome安装情况,echarts源码使用获取Chrome.exe路径。
开发流程:启动Chrome.exe,获取窗口句柄,转化为QWindow,嵌入界面。
总结:功能完整,但浏览器状态与客户端状态耦合,用户行为影响嵌入界面显示。
基于Chrome的CEF3实现
Chromium Embedded Framework(CEF)提供嵌入式浏览器支持。此方案需下载编译包,参照官方文档,实现嵌入网页界面。环境配置:Qt5.9.6 + VS
下载并配置CEF与chromium源码。
开发流程:参考示例文档,配置工程,实现嵌入。
总结:功能完整,但受限于源码编译环境,实际使用效果受限。
基于微软的WebView2实现
Microsoft Edge WebView2 控件允许嵌入Web技术(HTML、CSS、JavaScript)到本机应用程序。阅读Django源码此方案通过读取进程窗口句柄实现嵌入。环境配置:Qt5.9.6 + VS,安装WebView2运行包。
开发流程:下载示例文档,配置NuGet包,启动WebView2进程,读取窗口句柄,嵌入界面。
总结:实现简单,功能与用户体验较好,但无法国产化。
总结
根据需求选择不同方案:仅显示网页时,推荐基于Qt自带控件;需视频播放时,考虑基于CEF的实现;受限环境,可选用WebView2。嵌入Chrome.exe方案存在不可控因素,不适合作为常规方案。通过比较不同方法的优缺点,可选最优方案满足需求。onvif库封装及qt工程调用onvif库实现设备搜索、获取码流地址等功能
一、前言
本文介绍了一个在vs环境下的男孩送花源码OnvifManager工程,其核心功能是对onvif库进行了封装调用。该工程包含搜索设备、获取码流地址、设备重启等接口,目前实现了基本功能,后续可扩展。此外,通过qt工程myonvif调用生成的动态库,实现了设备信息的显示、码流地址获取、设备重启以及网页访问功能。
二、OnvifManager 动态库接口说明
相关代码位于OnvifManager.h头文件中。
三、qt-demo工程myonvif
操作流程如下:
1)点击搜索按钮,等待加载数据。
2)数据加载完成后,展示设备信息。如信息不全,可能因密码问题。
3)单击表格中的设备行,可获取服务地址。
4)点击“获取码流地址”按钮,显示设备的rtsp码流地址。
5)点击“设备重启”按钮,对指定设备执行重启操作。
6)支持网页访问功能。
四、下载
欲体验完整功能,可访问免费qt工程调用onvif库,实现设备搜索、码流地址获取、设备重启等功能_onvif库资源-CSDN文库下载页面。此外,动态库源码及qt调用动态库工程源码可在onvif动态库源码及qt调用动态库工程源码,支持设备搜索、码流地址获取、重启等功能_qtonvif资源-CSDN文库下载页面获取。
请问什么是内核头文件(kernelheaders)、工具链(toolchai
KernelHeaders - Linux Kernel Newbies
Toolchains - eLinux.org
内核头文件(KernelHeaders)在编程中扮演着极其重要的角色,它们类似于你购买手机充电线时需要查看手机充电口类型,以确保充电线与手机兼容。对于编程者而言,写程序时需调用内核提供的功能或开发内核模块,首要条件是程序与内核的数据结构及函数接口匹配。内核头文件就是一组包含这些匹配条件的“头文件”,为C/C++语言设计。
程序员在编写程序时,可以将常量定义、宏定义、函数接口定义等写入头文件中。之后,通过#include指令将这些头文件包含至程序中,编译器会自动引入对应文件的内容,避免在程序中重复定义相同的元素。
举例而言,若程序需使用操作系统提供的chmod功能(用于修改文件访问权限),直接在程序中调用该函数无法实现。这时,通过网络查找,我们得知该函数原型为:int chmod(const char *path, mode_t mode);
将此原型声明添加到程序中,编译器则能够顺利编译。然而,这种做法被认为是“野路子”操作,因为Linux提供的结构与功能极其丰富,逐一查找并手动输入容易繁琐且易出错。
更进一步,某些函数和数据结构在不同版本的Linux内核中可能存在差异。硬编码此类信息可能在版本升级后导致问题。因此,正确的做法是通过#include指令引入对应的内核头文件,当Linux内核更新时,相应的定义会随之更新。编译器在发现接口不匹配时会报告错误,根据提示进行修改即可。
例如,通过#include指令获取chmod定义后,编程者可以自由使用相关函数。
简而言之,#include与法院判决书中的“根据中华人民共和国刑法第XXX条第X款规定”相似,是明确引用C/C++库接口规格的最权威定义。头文件作为格式规范且可被编译器识别的软件接口规格书,确保了接口访问的正确性,并能在接口更改时第一时间发现,从而避免软件因接口问题引发的错误。
内核头文件是Linux内核的接口规格书,旨在为编程者提供准确、一致的接口定义。
识别与处理头文件的工具是必不可少的,它们让编程者能够轻松操作并确保程序的正确性。除了头文件,程序本身也是机器可识别的,但它们无法直接被执行。现代编程使用高级语言,如C/C++,这些语言设计旨在提高人类可读性和可编写性,而机器识别的是二进制指令。
因此,需要一套工具将程序员编写的高级语言程序转换为可执行的二进制序列。这些工具包括编译器、链接器、调试器以及make工具。编译器将源代码转换为目标文件;链接器整合目标文件与动态/静态链接库,理顺引用关系,生成可执行文件或库文件;调试器跟踪程序执行过程,帮助观察并修改运行中的程序状态;make工具则管理源文件之间的依赖关系,确保正确编译。
不同目的、应用领域和团队偏好决定了这些工具的多样性。例如,C/C++和Java在不同领域应用广泛,而Python在网页开发中更为便捷。团队可能选择cmake、qt以及qmake等工具,以适应不同需求。随着工具的不断演化,它们在编译、链接和管理过程中的功能也日益复杂。
这一整套工具组成了所谓的工具链(Toolchain),它旨在将源码正确转换为可执行程序,支持不同开发环境和编程语言。随着技术的不断进步,工具链也在不断发展,以满足编程者的多样化需求。
2024-12-22 16:56
2024-12-22 16:38
2024-12-22 16:33
2024-12-22 16:30
2024-12-22 15:40
2024-12-22 15:34