iis服务器助手广告
返回顶部
首页 > 资讯 > 操作系统 >linux程序开发如何入门
  • 156
分享到

linux程序开发如何入门

2023-06-17 01:06:52 156人浏览 薄情痞子
摘要

今天就跟大家聊聊有关linux程序开发如何入门,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种“迷信”在目前似乎还很

今天就跟大家聊聊有关linux程序开发如何入门,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种“迷信”在目前似乎还很普遍。然而,情况并不是这样的,从程序库的支持方面,Linux平台为用户级应用程序的开发提供了很多功能强大且丰富的程序库,而且它们大部分是跨平台的(Boost、OpenGL、STL、Qt、Java等)和基于POSIX标准的(glibc等),同时Linux内核还为驱动程序的开发提供了功能完备的内核接口,从开发工具方面,Linux提供了功能强大的编译器GCC和调试器GDB,借助它们的帮助,我们可以很轻松的在Linu x上开发出可移植性的应用程序。既然如此,“迷信”又源于何来呢?我想,一方面由于详细介绍Linux各种开发的书籍较少,各种Linux应用在国内仍不普及,另一方面则是由于很多人在安装好一个Linux后,苦于找不到一个得心应手的IDE环境,从而感到不知所措,毕竟,我们很多人都习惯了写好程序后,按下F5,剩下的任务就让IDE全权代理了。其实想在Linux下如此这般当然也没问题。既然说到了IDE,就让我们从它开始吧,相信选择一个好的IDE环境是你整个学习过程的一个不错的开始。

工欲善其事必先利其器——IDE篇

其实Linux下有许多功能强大的IDE环境,因为从某种意义上说,Linux是专为开发者准备的操作系统,这个东西当然少不了,在这里为读者介绍一些比较常用的IDE。

KDevelop

这是一个用Qt开发的IDE,其主要支持的语言是C / c++

Eclipse

近年来,eclipse可以说发展极为迅速,它不仅是一个以java为主的开发平台,其功能强大的插件体系结构使得它可以被当作各种应用程序来使用。作为各种插件的载体,eclipse提供了完整的GUI接口,用户完全可以借助eclipse来只关心自己想做的工作。

EMacs

VIM

山高月晓水落石出——IDE后台的故事GCC篇

前面我们简要介绍了一些IDE环境,其中所有C/C++相关程序的编译都是由GCC来完成的,而IDE只不过起到了一个收集编译信息和为我们的项目生成makefile等作用(后面我们会提到)。出于目前Linux开发的特点,C仍是系统开发的主流语言。所以,对GCC有一个全面的了解是很有必要的,一旦IDE不能满足你的需求,我们要有手工打造程序的能力,而且出于学习的目的,我们往往不需要IDE生成的那些复杂的文件,为一个Hello world生成2M多的文件显然是多余的。

GCC的全称是GNU Compiler Collection,从这个名字我们不难看出,GCC代表着一个编译器的集合,目前GCC可以支持C, C++, Objective-C, Objective-C++, Fortran, Java, and Ada等语言。但是出于一般性考虑,我们这里只讨论GCC中的C/C++部分。

目前GCC的***发布版是4.0.0,但是这个版本由于使用了新技术和新的编码规范,很多旧的代码都需要修改才可以通过编译,所以并不推荐使用这个版本。而相对稳定的新版本目前是3.4.4,大家可以到GNU的主页上更新下载。那么究竟GCC强大在哪里,如何使用?下面我就通过几个简单而实际的例子带你看看GCC提供的强大功能。

通过Helloworld的编译熟悉GCC的基本使用方法

似乎为所有新语言提供一个Hello World样本程序已经成为了一种不成文的标准,人们通过它来认识语言的一些基本要素。在这里,我们使用一个Hello World来看看如何用GCC生成可执行文件。

把上面的文件存成helloworld.c,之后打开控制台,输入如下的命令gcc helloworld.c –o helloworld如果一切正常的话,你的控制台上应该没有任何输出。用ls查看你的工作目录,你会发现目录下多了一个名为helloworld的可执行文件,之后,执行./hellworld

就会看到这个程序的输出了

很简单不是吗?但是学过计算机的朋友都应该知道,程序的编译过程要分为下图所示的过程而GCC的强大之处就在于它允许你在上面所示的任何一个过程中停下来查看中间结果,并对其加以控制。

预处理首先是预处理过程,GCC的-E选项可以让GCC在预处理后停止编译,并向标准输出打印预处理过后的文件。下面的-o用于指定输出文件的文件名。

gcc –E hellowrold.c –o helloworld.cpp下面是helloworld.cpp的一部分的内容,我们看到,文件已经包含了stdio.h中的内容。

如果我们想执行下一步的编译过程,可以继续使用GCC的-x选项,该选项用于显示指定文件的后缀名(而不是让编译器根据后缀来自行判断)。我们比较常用的language type有如下几种,(如果读者想获得更为完整参数说名,请参考GCC manual):

l c c-header c-cpp-output

l c++ c++-header c++-cpp-output

l assembler assembler-with-cpp

另外,下表列出了常用的GCC后缀名

linux程序开发如何入门

当然,你也可以省略掉language type的部分,这时候GCC会根据文件的后缀名自行判断,就像你没有使用该选项一样。

下面继续我们的编译过程

编译如果我们想获得编译后的源文件可以使用-S选项,该选项让gcc只执行编译(生成汇编文件)而不进行汇编(生成目标文件),此时,我们可以用-o选项指定输出的汇编文件的名称。

gcc –S helloworld.cpp –o hellowrld.S

汇编另外,我们还可以使用GCC的-c选项来编译和汇编源文件而不链接,此时-o指定的输出文件就是编译后的目标文件名gcc –x c++ -c helloworld.cpp –o helloworld.o

链接***,我们可以利用GCC来把我们刚才生成的.o文件链接成可执行程序gcc helloworld.o –o helloworld这一次,我们使用了-o选项指定了可执行文件名,也就是说,根据输入文件类型的不同,-o有着不同的含义。

函数库的链接和包含文件对于我们编写的任和一个程序,没有库函数的支持是不可想象的,而当我们要使用的头文件和函数库不在GCC默认的搜索路径下的时候(例如OpenGL、Qt、KDE、Boost等),我们就需要手工来告诉GCC他们的位置。

先来看头文件路径的指定。我们可以利用-I来指定我们希望GCC去搜索的头文件目录,例如我们要使用X11的程序,我们就要使用下面的选项再来看库函数的设置:我们通过-L和-l两个命令行选项完成任务。其中-L用于告诉GCC在中去寻找函数库,而-l选项则告诉GCC使用用户指定的程序库。在Linux中,函数库的命名是遵循UNIX约定的,即lib{lib name},例如libSocket.so,所以当你需要告诉GCC使用这些库的时候,你就可以使用-lsocket选项。通常,这两个命令是结合在一起使用的,例如引用X11程序库的时候,我们可以这样:

–L/usr/X11R6/lib–lX11

另外,GCC在默认情况下使用共享库来链接程序,而当你想链接静态库的时候,一定要使用-static选项,例如-lncurses -static

在这一部分的***,我们对编译时用到的GCC常用命令做一个简要的总结

linux程序开发如何入门

上面,我们提到了关于GCC编译的常用命令,这里另外补充一些帮助性的常用命令,他们可以让你对GCC的基本配置和使用作一个了解。

linux程序开发如何入门

在这部分的***,我们来谈一谈关于构建软件时链接参数的设定问题。在上面的第5部分我们已经提到了,函数库的使用是需要-L和-l一起配合来使用的,但实际上,往往一个像样的程序需要很多库的支持,例如,如果你需要编写一个GTK程序,我们需要下面的链接参数:-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 –lm,看上去有些吓人,你可能会问,我如何知道需要这些呢,如果我想编写KDE的程序呢,还有OpenGL呢?其实,情况比你想象的要好很多,在/usr/bin目录下,有很多名为xxx-config的脚本,它们的作用就是向用户显示编译链接程序时使用的参数的。这些脚本可以接受一些参数,比较常用的有—libs用于列出链接特定程序时使用的程序库,另外--cflags用于生成头文件的包含目录,也就是上面我们提到的-I参数。于是,对于GTK程序,我们可以使用下面的命令来编译:gcc gtksource.c `gtk-config –libs --cflags`当然,为每一种程序写一个config显然不是一个好办法,目前新的开发包都使用pkg-config这个脚本来生成链接参数。你可以使用pkg-config –list-all查看pkg-config支持的所有链接参数当你在上面这份列表中查到了自己想要程序包时,就可以使用下面的命令来编译程序了gcc.suffix `pkg-config--libs --cflags`

让GCC帮助你更好的工作

上面我们简单介绍了GCC的常用命令行选项,其实GCC的功能比上面提到的那些要丰富得多,GCC对代码的警告、优化、调试等方面提供了丰富的支持,下面我们就从一些例子来看看GCC提供的这些功能。

1.对问题代码提出警告

GCC对程序代码提供了完整的检查功能,由于C/C++语言本身的特点,很多错误都是程序员无意间犯下的,例如使用了未定义的变量、在bool表达式中使用了=而不是==等等问题,利用GCC提供的代码检查功能,我们可以让编译器为我们找到这些问题,避免运行时发生灾难。

首先,我们来看一个“问题代码”

#include#include

void main() {

int a, b; long long l = 2.2;

miss_decl();

if (a = 0)

printf (“a really equals to 0?\n”); if (b != 0)      printf(“We make a mistake again! b = %d\n”, “We should put b here”);

};

void miss_decl() {

printf(“We should put the declaration before it‘s been used!\n”);

}

上面这些代码故意制造了很多编程中出现的常见问题,接下来,我们就用这段代码来检测一下GCC提供的各种常用的警告设施。

首先,我们不使用任何警告设施编译上面的程序gcc test_warning.c –o test_warning默认情况下,GCC会给出输出,其中GCC识别出了main函数不标准(warning)以及使用了未声明的函数(error)两个问题,但是其他的GCC并未察觉。

1.利用-pedantic找出不符合ANSI / ISO标准的代码

执行下面的命令:gcc –pedantic test_warning.c –o test_warning可以看到,这次GCC以警告的形式报告了代码中long long的使用,但是要说明的是我们并不能依赖这个选项来保证我们的代码完全符合ANSI / ISO标准,因为该选项只报告ANSI C要求编译器进行检察的内容。另外,你还可以使用-pedantic-errors让GCC把所有的警告都变成错误。

利用-WfORMat检查printf中的参数不匹配问题执行下面的命令:gcc –Wformat test_warning.c –o test_warning

利用-WComment找出注释中的错误执行下面的命令:gcc –WComment test_warning.c –o test_warning

利用-Wparentheses查找bool表达式中的=错误执行下面的命令:gcc –Wparentheses test_warning.c –o test_warning

用-Wuninitialized查找未初始化变量的使用执行下面的命令:gcc –O –Wuninitialized test_warning.c –o test_warning值得说明的是,在使用这个选项的时候,一定要配合上-O(后面我们会提到)选项

利用-Wimplicit-function-declaration / -Werror-implicit-function-declaration检查未声明函数的使用执行下面的命令:gcc -Wimplicit-function-declaration test_warning.c –o test_warning另外-Werror-implicit-function-declaration和-Wimplicit-function-declaration作用是类似的,只是如果你使用了未声明的函数,前者会把它认为是一个错误。

如果你只是想对你的代码进行全面的检查,你大可不必把上面的选项一并列出来,GCC提供了-Wall选项,含义就是列出所有代码中的警告执行下面的命令:gcc –Wall test_warning.c –o test_warning 8. 如果你想走另一个极端,也就是不想让gcc输出任何警告,那么使用-w选项,该选项禁止所有的警告执行下面的命令:gcc –w test_warning.c –o test_warnin

<输出结果>

对于上面所有的选项,你都可以把它们和-Werror选项一起使用,这样就可以把所有的警告都变成错误。另外,如果你只是想对代码进行检查而并不执行编译的话,可使用-fsyntax-only选项,像下面的命令这样gcc –fsyntax-only test_warning.c基本上来说,我们常用的一些警告选项就是这些,而其中-Wall更是我们极为常用的功能。

优化选项这一部分的内容可以分成两部分,一部分是让编译器对代码进行分析

后,进行的代码优化,另一部分是我们可以为编译器制定一些关于硬件的信息,让他生成对硬件结合的更好的代码,而我们之所以要用源代码来编译程序,很多情况下,是出于这方面的原因。

首先来看代码优化,从代码的整体优化上,GCC提供了下面的选项

-O–O1

这两个选项的含义是一样的,GCC将执行减少代码尺寸和执行时间的优化,对于那些会严重影响编译时间的优化选项,这个级别的优化并不会执行。

-O2

在这一级别GCC将会提供所有支持的优化,但这其中并不包括以空间换时间的优化手段,例如编译器不会使用循环展开和函数内联。和-O相比,该选项进一步加快了编译时间和生成代码的性能。

-O3

除了-O2提供的优化选项外,还指定了-finline-functions,-funswitch-loops和-fgcse-afer-reload选项,目的只有一个就是全力执行代码优化。

-Os

这个选项是专门用来优化代码尺寸的,-Os打开了所有-O2级别中不会显著增长代码尺寸的优化选项

-O0

该选项代表不执行优化

在这里要说明的是,尽管GCC提供了1~3和s这4个整体优化选项,但从实际的优化效果上来看,往往O3优化出来的程序的效率并不是***的,而大部分情况下我们都在使用-O2,如果你希望获得***的效率利益,那么不妨这4个选项都试试。另外,其实这些选项只不过是GCC提供的很多单方面优化的一个组合,如果你想了解更为具体的优化内容,可以去查看GCC手册,出于篇幅限制,这里不细谈了。***要记住的一点是,如果你的程序是用于高精度数值计算的,那么记住不要使用上面任何的优化选项。

下面来看基于硬件优化,由于这部分和计算机硬件相关,这里仅用Intel的CPU做一些说明:对于所有为Intel和AMD x86-64提供的优化选项都是用m开头的,下面写一些常用的选项:

-march

该选项用来指定CPU的类型,常用的有i386 \ i486 \ i586 \ pentium-mmx \ i686 \ pentium2 \ pentium3 \ pentium-m \ pentium4 \ prescott \ k6 \ athlon \ athlon-4 \ k8等等,读者可以根据自己的情况进行指定。

-mfpmath

该选项用于指定浮点运算单元的类型。包括

387

使用标准的数学协处理器

sse

使用SSE指令集提供的标量浮点运算。在Pentium3 \ Athlon-4以及更新的芯片上支持这个特性。另外,在pentium4以及AMD x86-64处理器上,SSE2还可以进行双精度浮点计算。

sse,387混合使用387数学协处理器和SSE指令集,该选项可以充分的利用CPU的浮点寄存器和xmm寄存器,但是该选项还处在试验阶段。

-malign-double

该选项使得GCC把double \ long double \ long long类型的变量在4字节或2字节地址上对齐,在Pentium级的CPU上,这会使得代码的执行速度更快,当然带来的代价是需要更多的内存来执行程序。-mmmx –msse –msse2 –msse3 –m3Dnow这些选项用来启动内置函数直接使用这些处理器扩展指令的功能。在编译3D或多媒体程序的时候,使用他们是非常有效的。

对调试的支持当程序出错的时候,我们可以在Visual Studio中轻松的进行调试,而在Linux中,一旦出现Segmentation Fault,似乎我们除了用眼睛去看代码就没有更好的选择了,其实情况不然,用GCC向程序加入一些适当的调试信息,我们可以利用GDB去调试程序。在这里,我们介绍最为常用的-g和-ggdb选项。

先来看-g。该选项可以利用操作系统的“原生格式(native format)”生成调试信息。GDB可以直接利用这个信息。尽管我们可以把-O和-g放在一起使用,但是,这种做法是极为不推荐的。

如果你想用GDB来调试程序,那么你可以使用-ggdb来让GCC为GDB生成更为丰富的调试信息,但是,此时你就不能用其他的调试器来进行调试了。

最后要说明的是,上面这两个选项都可以接受一个输出调试信息的级别,默认的级别是2。如果你指定1级(-g1),那么GCC会生成最少的调试信息,这包括函数和全局变量的描述信息,但是对于局部变量和行号等信息,在这个级别是不会输出的。另外一个级别是3级(-g3),在这一级别上,GCC会为程序中的所有宏定义和符号生成调试信息。

看完上述内容,你们对linux程序开发如何入门有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网操作系统频道,感谢大家的支持。

--结束END--

本文标题: linux程序开发如何入门

本文链接: https://www.lsjlt.com/news/286574.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux程序开发如何入门
    今天就跟大家聊聊有关linux程序开发如何入门,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种“迷信”在目前似乎还很...
    99+
    2023-06-17
  • Android开发入门教程
    当涉及到 Android 开发入门教程时,以下是一个详细的大纲,包含了一些常见的实践和指导: Android 概述    - 介绍 Android 平台的基本概念和特点    - 解释 Android 应用的组成和架构    - 说明 A...
    99+
    2023-09-02
    android
  • 如何入门Go语言开发?
    如何入门Go语言开发? Go语言(又称Golang)是一种由Google开发的开源编程语言,它具有快速编译、静态类型、并发编程等特点,适用于开发高性能的后端服务、网络应用、云计算等领域...
    99+
    2024-04-02
  • 微信小程序入门开发实例分析
    这篇“微信小程序入门开发实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序入门开发实例分析”文章吧。注册微信小...
    99+
    2023-06-30
  • 微信小程序开发实战快速入门教程
    目录注册微信小程序微信开发者工具第一个小程序新建项目项目目录结构目标成果步骤分解页头页尾个人中心生活指南模拟弹窗预览图片注册微信小程序 如果你还没有微信公众平台的账号,请先进入微信公...
    99+
    2024-04-02
  • 微信小程序游戏怎么开发入门教程
    微信小程序游戏开发是现在比较热门的小程序类型开发项目,对于开发人员而言,怎么开发微信小程序游戏呢?今天小编分享一篇小游戏的入门开发教程,希望对微信小程序制作开发人员提供参考。 注册一个小程序账号 在官方注册一个微信小程序账号(注册申请教程)...
    99+
    2023-08-20
    微信小程序 游戏 小程序
  • Java开发者如何入门Apache Camel
    这篇文章给大家介绍Java开发者如何入门Apache Camel,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Apache Camel是一个非常实用的规则引擎库,能够用来处理来自于不同源的事件和信息。你可以在使用不同的...
    99+
    2023-06-17
  • 微信小程序开发【从0到1~入门篇】
    目录 1. 微信小程序介绍 1.1 什么是小程序? 1.2  小程序可以干什么? 2. 申请账号 2.1 申请帐号 2.2 测试号申请(我们小程序账号申请完成之后,建议务必要申请一个测试号用来开发) 3. 安装开发工具 3.1 选择稳定版...
    99+
    2023-08-31
    微信小程序 小程序
  • 开发者如何快速入门Python
    今天就跟大家聊聊有关开发者如何快速入门Python,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python确实是个好语言,这点毋庸置疑, Python一直以简洁方便而又强大著称,其...
    99+
    2023-06-17
  • Python Tkinter 应用程序开发:从入门到精通
    Tkinter 是 Python 的一个标准 GUI 库,用于创建跨平台桌面应用程序。它提供了一个简单的界面,使开发者能够轻松创建具有窗口、按钮、标签等基本控件的应用程序。 2. 安装 Tkinter 默认情况下,Tkinter 已包含在...
    99+
    2024-04-02
  • 微信小程序开发之入门的示例分析
    这篇文章给大家分享的是有关微信小程序开发之入门的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、注册小程序账号1、进入微信公众平台(https://mp.weixin....
    99+
    2024-04-02
  • 如何快速入门PHP商城开发?
    随着电子商务的蓬勃发展,越来越多的人开始关注线上商城的开发。而PHP作为一种流行的Web开发语言,其开发商城的技能更是得到了广泛应用。如果你是一名初学者,但想要快速入门PHP商城开发,请看下文。一、学习PHP语言的基础知识在开始学习PHP商...
    99+
    2023-05-14
    PHP 入门 商城开发
  • 开发者,熊二都会的Linux入门
    关键词:Linux | CentOS | 服务器 | 入门 鱼和熊掌,不可兼得, Linux 和 Windows 亦是如此,Windows注重用户体验,而Linux注重系统稳定,所以Window...
    99+
    2023-09-06
    云原生 linux 服务器 运维 个人开发
  • PHP从入门到精通—PHP开发入门-PHP概述、PHP开发环境搭建、PHP开发环境搭建、第一个PHP程序、PHP开发流程
    每开始学习一门语言,都要了解这门语言和进行开发环境的搭建。同样,学生开始PHP学习之前,首先要了解这门语言的历史、语言优势等内容以及了解开发环境的搭建。 ...
    99+
    2023-09-30
    php 开发语言
  • 小程序入门笔记(一) 黑马程序员前端微信小程序开发教程
    微信小程序基本介绍 小程序和普通网页有以下几点区别: 运行环境:小程序可以在手机的操作系统上直接运行,如微信、支付宝等;而普通网页需要在浏览器中打开才能运行。 开发技术:小程序采用前端技术进行开...
    99+
    2023-10-08
    小程序 笔记 前端
  • 前端开发入门
    前端开发的前世今生在web1.0时代,前端和后端还没分离开来,前后端职责混乱。Ajax技术的出现,web2.0时代到来,此时前端后端开始分离开来,前后端职责清晰了,前端只要专注于前端开发,后端可以专注于业务逻辑开发,前端与后端的衔接就是AP...
    99+
    2023-06-03
  • 入门 Go 编程:如何使用 Linux?
    Go 编程语言是一种现代、高效的编程语言,由 Google 开发并于 2009 年正式发布。由于其简单易学、高效可靠等特点,Go 语言已经成为了现代 Web 开发、云计算、网络编程等领域的首选语言之一。本文将介绍如何使用 Linux 系统来...
    99+
    2023-07-28
    关键字 教程 linux
  • Linux 开发技术和 Go 学习笔记:如何快速入门?
    随着互联网行业的飞速发展,Linux 开发技术和 Go 编程语言成为了越来越多开发者的必备技能。本文将为大家介绍如何快速入门 Linux 开发技术和 Go 编程语言,并穿插演示代码,帮助大家更好地理解和掌握相关知识。 一、Linux 开发...
    99+
    2023-11-02
    学习笔记 linux 开发技术
  • 小程序如何开发
    这篇文章将为大家详细讲解有关小程序如何开发,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信官方简易教程我们先来看看微信官网给出的简易教程。起步基础,注册小程序帐号之后,需要安装开发工具,然后在官方开发工...
    99+
    2023-06-02
  • python web开发入门
    Ps:2019-1-18修改 我其实对这篇文章能有两万+的阅读量感觉很惊讶,占了我博客访问人数的很大一部分,我猜测可能确实是传统的Python web开发的学习方式都是从框架开始,而框架封装过度,让人难以理解背后的原理,最后只是简...
    99+
    2023-01-31
    入门 python web
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作