【转】搭建带软浮点交叉编译工具链
一 使用crosstool-ng为s3c6410制作交叉编译工具链来自:http://www.usr.cc/thread-51735-1-1.html -前言 以前都是用别人做好的工具链,现在想自己做个工具链。先是看看CLFS的文档,对交叉编译工具链的编译过程有个基本了解,然后下载codesourcecs2008q3的源代码包,根据其提供的编译脚本,花了一天时间
来自:http://www.usr.cc/thread-51735-1-1.html
-
前言环境 主机硬件: 奔腾双核T4400(2.2G Hz) 2.5G内存 操作系统: Scientific Linux 6.0 x86版 主要软件: GCC 4.4.4 Binutils 2.20 制作过程
改成:
二 用crosstool-NG-1.9.3构建ARM工具链 来自:http://busybox.is-programmer.com/posts/24549.html 在成功重装了两次系统之后之前的移植工作终于还是被我弄丢了,无奈只好一切重头再来了。
http_proxy = http://58.248.245.225:80/ use_proxy = on 就行了,build的时候还是死掉了,原因是.../scripts/functions文件中的代码 # OK, just look if we have them...
_aria2c=$(CT_Which aria2c)
_wget=$(CT_Which wget)
#_curl=$(CT_Which curl)
# Wrapper function to call one of, in order of preference:
#
#
#
# Usage: CT_DoGetFile
CT_DoGetFile() {
#CT_DoLog EXTRA "1 ${_aria2c}"
#CT_DoLog EXTRA "2 ${_curl}"
#CT_DoLog EXTRA "3 ${_wget}"
if
[ -n
"${_aria2c}"
-a ${CT_DOWNLOAD_MAX_CHUNKS} -gt 1 ];
then
CT_DoGetFileAria2
"$1"
elif
[ -n
"${_curl}"
];
then
CT_DoGetFileCurl
"$1"
elif
[ -n
"${_wget}"
];
then
CT_DoGetFileWget
"$1"
else
CT_Abort
"Could find neither wget nor curl"
fi
实际上CT_DoGetFile函数调用的是CT_DoGetFileCurl而非刚才设置的wget,把上面的那个_curl=$(CT_Which curl)注释掉就行了。 程序脚本中安装文件的下载地址有时不可用,需要修改以下。 下载完成之后重新开始安装,最后成功! .config的文件内容如下: # Automatically generated make config: don't edit
# crosstool-NG version: 1.9.3
# Fri Feb 18 19:16:42 2011
#
# CT_BACKEND is not set
CT_MODULES=y
#
# Paths and misc options
#
#
# crosstool-NG behavior
#
# CT_OBSOLETE is not set
CT_EXPERIMENTAL=y
# CT_DEBUG_CT is not set
#
# Paths
#
CT_LOCAL_TARBALLS_DIR=
"${HOME}/src"
CT_SAVE_TARBALLS=y
CT_WORK_DIR=
"${CT_TOP_DIR}/targets"
CT_PREFIX_DIR=
"${HOME}/x-tool-2/${CT_TARGET}"
CT_INSTALL_DIR=
"${CT_PREFIX_DIR}"
CT_REMOVE_DOCS=y
CT_INSTALL_DIR_RO=y
CT_STRIP_ALL_TOOLCHAIN_EXECUTABLES=y
#
# Downloading
#
# CT_FORBID_DOWNLOAD is not set
# CT_FORCE_DOWNLOAD is not set
CT_USE_MIRROR=y
# CT_PREFER_MIRROR is not set
CT_MIRROR_BASE_URL=
"http://ymorin.is-a-geek.org/mirrors/"
CT_CONNECT_TIMEOUT=10
CT_DOWNLOAD_MAX_CHUNKS=1
# CT_ONLY_DOWNLOAD is not set
#
# Extracting
#
# CT_FORCE_EXTRACT is not set
CT_OVERIDE_CONFIG_GUESS_SUB=y
# CT_ONLY_EXTRACT is not set
CT_PATCH_BUNDLED=y
# CT_PATCH_LOCAL is not set
# CT_PATCH_BUNDLED_LOCAL is not set
# CT_PATCH_LOCAL_BUNDLED is not set
# CT_PATCH_BUNDLED_FALLBACK_LOCAL is not set
# CT_PATCH_LOCAL_FALLBACK_BUNDLED is not set
# CT_PATCH_NONE is not set
CT_PATCH_ORDER=
"bundled"
# CT_PATCH_SINGLE is not set
# CT_PATCH_USE_LOCAL is not set
#
# Build behavior
#
CT_PARALLEL_JOBS=1
CT_LOAD=0
CT_USE_PIPES=y
# CT_CONFIG_SHELL_SH is not set
# CT_CONFIG_SHELL_ASH is not set
CT_CONFIG_SHELL_BASH=y
# CT_CONFIG_SHELL_CUSTOM is not set
CT_CONFIG_SHELL=
"bash"
#
# Logging
#
# CT_LOG_ERROR is not set
# CT_LOG_WARN is not set
# CT_LOG_INFO is not set
CT_LOG_EXTRA=y
# CT_LOG_ALL is not set
# CT_LOG_DEBUG is not set
CT_LOG_LEVEL_MAX=
"EXTRA"
# CT_LOG_SEE_TOOLS_WARN is not set
CT_LOG_PROGRESS_BAR=y
CT_LOG_TO_FILE=y
CT_LOG_FILE_COMPRESS=y
#
# Target options
#
CT_ARCH=
"arm"
CT_ARCH_SUPPORTS_BOTH_MMU=y
CT_ARCH_SUPPORTS_BOTH_ENDIAN=y
CT_ARCH_SUPPORTS_32=y
# CT_ARCH_SUPPORTS_64 is not set
CT_ARCH_SUPPORT_ARCH=y
# CT_ARCH_SUPPORT_ABI is not set
CT_ARCH_SUPPORT_CPU=y
CT_ARCH_SUPPORT_TUNE=y
CT_ARCH_SUPPORT_FPU=y
CT_ARCH_DEFAULT_HAS_MMU=y
# CT_ARCH_DEFAULT_BE is not set
CT_ARCH_DEFAULT_LE=y
CT_ARCH_DEFAULT_32=y
# CT_ARCH_DEFAULT_64 is not set
CT_ARCH_ARCH=
"armv4t"
CT_ARCH_CPU=
""
CT_ARCH_TUNE=
""
CT_ARCH_FPU=
""
# CT_ARCH_BE is not set
CT_ARCH_LE=y
CT_ARCH_32=y
# CT_ARCH_64 is not set
CT_ARCH_BITNESS=32
# CT_ARCH_FLOAT_HW is not set
CT_ARCH_FLOAT_SW=y
CT_TARGET_CFLAGS=
""
CT_TARGET_LDFLAGS=
""
#
# General target options
#
CT_ARCH_arm=y
# CT_ARCH_x86 is not set
# CT_ARCH_sh is not set
# CT_ARCH_avr32 is not set
# CT_ARCH_ia64 is not set
# CT_ARCH_mips is not set
# CT_ARCH_powerpc is not set
# CT_ARCH_s390 is not set
# CT_ARCH_m68k is not set
# CT_ARCH_alpha is not set
# CT_ARCH_blackfin is not set
CT_ARCH_arm_AVAILABLE=y
CT_ARCH_x86_AVAILABLE=y
CT_ARCH_sh_AVAILABLE=y
CT_ARCH_avr32_AVAILABLE=y
CT_ARCH_ia64_AVAILABLE=y
CT_ARCH_mips_AVAILABLE=y
CT_ARCH_powerpc_AVAILABLE=y
CT_ARCH_s390_AVAILABLE=y
CT_ARCH_m68k_AVAILABLE=y
CT_ARCH_alpha_AVAILABLE=y
CT_ARCH_blackfin_AVAILABLE=y
CT_ARCH_USE_MMU=y
#
# arm other options
#
CT_ARCH_ARM_MODE=
"arm"
CT_ARCH_ARM_MODE_ARM=y
# CT_ARCH_ARM_MODE_THUMB is not set
# CT_ARCH_ARM_INTERWORKING is not set
CT_ARCH_ARM_EABI=y
#
# Target optimisations
#
#
# Toolchain options
#
#
# General toolchain options
#
CT_USE_SYSROOT=y
CT_SYSROOT_DIR_PREFIX=
""
#
# Tuple completion and aliasing
#
CT_TARGET_VENDOR=
"cool"
CT_TARGET_ALIAS_SED_EXPR=
""
CT_TARGET_ALIAS=
"arm-cool-uClibc"
#
# Toolchain type
#
# CT_NATIVE is not set
CT_CROSS=y
# CT_CROSS_NATIVE is not set
# CT_CANADIAN is not set
CT_TOOLCHAIN_TYPE=
"cross"
#
# Build system
#
CT_BUILD=
""
CT_BUILD_PREFIX=
""
CT_BUILD_SUFFIX=
""
#
# Operating System
#
# CT_BARE_METAL is not set
# CT_MINGW32 is not set
CT_KERNEL_SUPPORTS_SHARED_LIBS=y
CT_KERNEL=
"linux"
CT_KERNEL_VERSION=
"2.6.33.7"
# CT_KERNEL_mingw32 is not set
# CT_KERNEL_bare_metal is not set
CT_KERNEL_linux=y
CT_KERNEL_mingw32_AVAILABLE=y
CT_KERNEL_bare_metal_AVAILABLE=y
CT_KERNEL_linux_AVAILABLE=y
CT_KERNEL_LINUX_INSTALL=y
# CT_KERNEL_V_2_6_36 is not set
# CT_KERNEL_V_2_6_35_8 is not set
# CT_KERNEL_V_2_6_34_7 is not set
CT_KERNEL_V_2_6_33_7=y
# CT_KERNEL_V_2_6_32_25 is not set
# CT_KERNEL_V_2_6_31_14 is not set
# CT_KERNEL_V_2_6_27_55 is not set
# CT_KERNEL_LINUX_CUSTOM is not set
CT_KERNEL_LINUX_VERBOSITY_0=y
# CT_KERNEL_LINUX_VERBOSITY_1 is not set
# CT_KERNEL_LINUX_VERBOSITY_2 is not set
CT_KERNEL_LINUX_VERBOSE_LEVEL=0
CT_KERNEL_LINUX_INSTALL_CHECK=y
# CT_KERNEL_LINUX_USE_CUSTOM_HEADERS is not set
#
# Common kernel options
#
CT_SHARED_LIBS=y
#
# Binary utilities
#
CT_ARCH_BINFMT_ELF=y
# CT_ARCH_BINFMT_FLAT is not set
# CT_ARCH_BINFMT_FDPIC is not set
#
# GNU binutils
#
# CT_BINUTILS_V_2_20_1 is not set
# CT_BINUTILS_V_2_20 is not set
CT_BINUTILS_V_2_19_1=y
# CT_BINUTILS_V_2_19 is not set
# CT_BINUTILS_V_2_18 is not set
# CT_BINUTILS_V_2_17 is not set
# CT_BINUTILS_V_2_16_1 is not set
CT_BINUTILS_VERSION=
"2.19.1"
CT_BINUTILS_EXTRA_CONFIG=
""
CT_BINUTILS_FOR_TARGET=y
CT_BINUTILS_FOR_TARGET_IBERTY=y
CT_BINUTILS_FOR_TARGET_BFD=y
#
# C compiler
#
CT_CC=
"gcc"
CT_CC_VERSION=
"4.3.2"
CT_CC_gcc=y
# CT_CC_V_4_5_1 is not set
# CT_CC_V_4_5_0 is not set
# CT_CC_V_4_4_5 is not set
# CT_CC_V_4_4_4 is not set
# CT_CC_V_4_4_3 is not set
# CT_CC_V_4_4_2 is not set
# CT_CC_V_4_4_1 is not set
# CT_CC_V_4_4_0 is not set
# CT_CC_V_4_3_5 is not set
# CT_CC_V_4_3_4 is not set
# CT_CC_V_4_3_3 is not set
CT_CC_V_4_3_2=y
# CT_CC_V_4_3_1 is not set
# CT_CC_V_4_2_4 is not set
# CT_CC_V_4_2_3 is not set
# CT_CC_V_4_2_2 is not set
# CT_CC_V_4_2_1 is not set
# CT_CC_V_4_2_0 is not set
# CT_CC_V_4_1_2 is not set
# CT_CC_V_4_0_4 is not set
# CT_CC_V_3_4_6 is not set
CT_CC_GCC_4_2_or_later=y
CT_CC_GCC_4_3_or_later=y
# CT_CC_GCC_4_4_or_later is not set
# CT_CC_GCC_4_5_or_later is not set
# CT_CC_GCC_HAS_GRAPHITE is not set
# CT_CC_GCC_HAS_LTO is not set
CT_CC_GCC_USE_GMP_MPFR=y
# CT_CC_GCC_USE_PPL_CLOOG is not set
# CT_CC_GCC_USE_MPC is not set
# CT_CC_GCC_USE_LIBELF is not set
CT_CC_PKGVERSION=
"crosstool-NG-${CT_VERSION}"
CT_CC_BUGURL=
""
CT_CC_ENABLE_CXX_FLAGS=
""
CT_CC_CORE_EXTRA_CONFIG=
""
CT_CC_EXTRA_CONFIG=
""
CT_CC_SUPPORT_CXX=y
CT_CC_SUPPORT_FORTRAN=y
CT_CC_SUPPORT_JAVA=y
CT_CC_SUPPORT_ADA=y
CT_CC_SUPPORT_OBJC=y
CT_CC_SUPPORT_OBJCXX=y
#
# Additional supported languages:
#
CT_CC_LANG_CXX=y
# CT_CC_LANG_FORTRAN is not set
# CT_CC_LANG_JAVA is not set
# CT_CC_LANG_ADA is not set
# CT_CC_LANG_OBJC is not set
# CT_CC_LANG_OBJCXX is not set
CT_CC_LANG_OTHERS=
""
#
# gcc other options
#
CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y
# CT_CC_GCC_LIBMUDFLAP is not set
# CT_CC_GCC_LIBGOMP is not set
# CT_CC_GCC_LIBSSP is not set
#
# Misc. obscure options.
#
CT_CC_CXA_ATEXIT=y
# CT_CC_GCC_DISABLE_PCH is not set
CT_CC_GCC_SJLJ_EXCEPTIONS=m
CT_CC_GCC_LDBL_128=m
#
# C-library
#
CT_LIBC=
"uClibc"
CT_LIBC_VERSION=
"0.9.30.2"
# CT_LIBC_mingw is not set
# CT_LIBC_glibc is not set
# CT_LIBC_newlib is not set
CT_LIBC_uClibc=y
# CT_LIBC_none is not set
# CT_LIBC_eglibc is not set
CT_LIBC_mingw_AVAILABLE=y
CT_LIBC_glibc_AVAILABLE=y
CT_LIBC_newlib_AVAILABLE=y
CT_LIBC_uClibc_AVAILABLE=y
# CT_LIBC_UCLIBC_V_0_9_31 is not set
# CT_LIBC_UCLIBC_V_0_9_30_3 is not set
CT_LIBC_UCLIBC_V_0_9_30_2=y
# CT_LIBC_V_0_9_30_1 is not set
# CT_LIBC_V_0_9_30 is not set
# CT_LIBC_V_0_9_29 is not set
# CT_LIBC_V_0_9_28_3 is not set
# CT_LIBC_V_snapshot is not set
# CT_LIBC_V_specific_date is not set
CT_LIBC_UCLIBC_0_9_30_or_later=y
CT_LIBC_UCLIBC_PARALLEL=y
CT_LIBC_UCLIBC_VERBOSITY_0=y
# CT_LIBC_UCLIBC_VERBOSITY_1 is not set
# CT_LIBC_UCLIBC_VERBOSITY_2 is not set
CT_LIBC_UCLIBC_VERBOSITY=
""
CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
CT_LIBC_UCLIBC_DEBUG_LEVEL=0
CT_LIBC_UCLIBC_CONFIG_FILE=
"${HOME}/scratch/toolchain-build/${CT_LIBC}-${CT_LIBC_VERSION}.config"
CT_LIBC_none_AVAILABLE=y
CT_LIBC_eglibc_AVAILABLE=y
CT_LIBC_SUPPORT_THREADS_ANY=y
# CT_LIBC_SUPPORT_NPTL is not set
CT_LIBC_SUPPORT_LINUXTHREADS=y
# CT_LIBC_SUPPORT_WIN32THREADS is not set
CT_THREADS=
"linuxthreads"
#
# Common C library options
#
# CT_THREADS_NPTL is not set
CT_THREADS_LINUXTHREADS=y
# CT_THREADS_WIN32THREADS is not set
# CT_THREADS_NONE is not set
CT_LIBC_XLDD=y
#
# uClibc other options
#
CT_LIBC_UCLIBC_LNXTHRD_OLD=y
# CT_LIBC_UCLIBC_LNXTHRD_NEW is not set
CT_LIBC_UCLIBC_LNXTHRD=
"old"
# CT_LIBC_UCLIBC_LOCALES is not set
# CT_LIBC_UCLIBC_WCHAR is not set
#
# Debug facilities
#
CT_DEBUG_ltrace=y
CT_LTRACE_V_0_5_3=y
# CT_LTRACE_V_0_5_2 is not set
# CT_LTRACE_V_0_5 is not set
# CT_LTRACE_V_0_4 is not set
CT_LTRACE_VERSION=
"0.5.3"
CT_LTRACE_0_5_3_or_later=y
CT_DEBUG_gdb=y
CT_GDB_CROSS=y
# CT_GDB_CROSS_STATIC is not set
# CT_GDB_NATIVE is not set
CT_GDB_GDBSERVER=y
CT_GDB_GDBSERVER_STATIC=y
# CT_GDB_V_7_2 is not set
# CT_GDB_V_7_1 is not set
# CT_GDB_V_7_0_1 is not set
# CT_GDB_V_7_0 is not set
CT_GDB_V_6_8=y
CT_GDB_VERSION=
"6.8"
CT_DEBUG_duma=y
CT_DUMA_A=y
CT_DUMA_SO=y
CT_DUMA_V_2_5_15=y
# CT_DUMA_V_2_5_14 is not set
# CT_DUMA_V_2_5_12 is not set
# CT_DUMA_V_2_5_8 is not set
# CT_DUMA_V_2_5_1 is not set
CT_DUMA_VERSION=
"2_5_15"
CT_DEBUG_dmalloc=y
CT_DMALLOC_V_5_5_2=y
CT_DMALLOC_VERSION=
"5.5.2"
CT_DEBUG_strace=y
# CT_STRACE_V_4_5_20 is not set
CT_STRACE_V_4_5_19=y
# CT_STRACE_V_4_5_18 is not set
# CT_STRACE_V_4_5_17 is not set
# CT_STRACE_V_4_5_16 is not set
# CT_STRACE_V_4_5_15 is not set
CT_STRACE_VERSION=
"4.5.19"
#
# Companion libraries
#
CT_COMPLIBS_NEEDED=y
CT_GMP_NEEDED=y
CT_MPFR_NEEDED=y
# CT_PPL_NEEDED is not set
# CT_CLOOG_NEEDED is not set
# CT_MPC_NEEDED is not set
# CT_LIBELF_NEEDED is not set
CT_COMPLIBS=y
# CT_WRAPPER_NEEDED is not set
CT_GMP=y
CT_MPFR=y
CT_LIBELF_TARGET=y
# CT_GMP_V_5_0_1 is not set
CT_GMP_V_4_3_2=y
# CT_GMP_V_4_3_1 is not set
# CT_GMP_V_4_3_0 is not set
# CT_GMP_V_4_2_4 is not set
# CT_GMP_V_4_2_2 is not set
CT_GMP_VERSION=
"4.3.2"
# CT_MPFR_V_3_0_0 is not set
CT_MPFR_V_2_4_2=y
# CT_MPFR_V_2_4_1 is not set
# CT_MPFR_V_2_4_0 is not set
# CT_MPFR_V_2_3_2 is not set
# CT_MPFR_V_2_3_1 is not set
CT_MPFR_VERSION=
"2.4.2"
#
# libelf version needed to build for target
#
CT_LIBELF_V_0_8_13=y
# CT_LIBELF_V_0_8_12 is not set
CT_LIBELF_VERSION=
"0.8.13"
#
# Companion libraries common options
#
CT_COMPLIBS_BACKUP=y
# CT_COMPLIBS_CHECK is not set
# CT_COMPLIBS_SHARED is not set
#
# Companion tools
#
#
# READ HELP before you say 'Y' below !!!
#
# CT_COMP_TOOLS is not set
#
# Test suite
#
# CT_TEST_SUITE is not set
# CT_TEST_SUITE_GCC is not set
参考链接: http://ymorin.is-a-geek.org/projects/crosstool 三 用crosstool-ng在ubuntu下构建交叉编译环境 来自:http://home.eeworld.com.cn/my/space.php?uid=67366&do=blog&id=43600
这个整的比较郁闷,公司的电脑太菜了,虚拟机一开,电脑连QQ都不敢开。编译一次耗费大量时间,在虚拟机下,还容易出问题。搞了几天,后来在家里的电脑上,28分钟就弄好了。下面记录流程:
1.下载工具crosstool-ng 最新版本是1.93。主机环境为ubuntu 10.04.开始我以为编译过程与主机上的GCC版本和GDB版本以及BINUTILS版本有关。后来发现没有关系。
2.切换到root用户下,安装相关工具。为了省事,以下所有操作都在root用户下。
apt-get install bison flex texinfo automake libtool cvs patch
apt-get install libncurses5* 这里怕安装不全,直接用*
apt-get install aria2 curl gcj g++ subversion
apt-get install glibc*.我编译到native gdb的时候出现了错误,我怀疑是这个地方有问题。当然有可能是其它原因,保险起见,还是安装这个东东,反正装好后,重新编译成功了,至于是不是这个原因,不去追究了。
下载:
expat-2.0.1.tar.gz linux-2.6.33.7.tar.bz2 一定要全部下载好,要不然以后的编译过程中,速度很慢还存在潜在的危险,说不定哪个包自动下载不下来,编译错误,那连原因也找不到
3.cd
mv mawk mawk.bak
ln -s gawk mawk
4.cd /home
mkdir crosstool-ng
cd crosstool-ng
mkdir src
将上面下载的源码包全部复制到 src目录下。
解压crosstool-ng-1.9.3到当前目录下。
cd crosstool-ng-1.9.3
./configure --prefix=/opt/crosstool-ng 后面的参数是安装目录,不用自己建立,她自动会建立。
会有两个No,没关系。继续。
make
make install
make clean
$ $ source ~/.bashrc下班了,明天继续写。 5.接下来 cd /home/crosstool-ng mkdir cd crosstool-ng-1.9.3_build/ cp /opt/crosstool-ng/lib/ct-ng-1.9.3/samples/arm-unknown-linux-gnueabi/crosstool.config .config 如果足够牛逼的话,直接编写这个配置文件。对于我而言,还是老老实实运行图形化配置工具。 改写下面的路径,按照上面的定义,最后的结果如下 Paths and misc options C compiler ---> *** Additional supported languages:*** [*] C++ [ ] Fortran [ ] Java 取消下面两个语言的选择。这个应该取消选择,否则容易出错。 Paths and misc options 保存退出。 6.如果你选择配置界面里面的LINUX版本整好为你下载的版本,例如2.6.32.25。则不需要执行以下操作。 否则,请修改内核,默认的内核版本为2.6.33.7。 vi .config 修改CT_KERNEL=“linux"我下载的内核源码 保存退出。 7.ct-ng build.4 bulid后面有个点,不要忘了。意思为4线程编译。一切正确配置的话。我的家里的电脑为酷睿双核E7200,金士顿8002G内存。所耗费时间为28分多种,编译成功。 8. source ~/.bashrc 9.arm-unknown-linux-gnueabi -v 会看到出来一大堆的东西。最后一行是 gcc version 4.3.2 (crosstool-NG-1.9.3-unknown) 10.其中arm-unknown-linux-gnueabi。中的UNKNOWN可以改为你想要的任何文字,这个步骤在上面的图形配置里面,不过没有什么意义,就不写了。 来自:http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94369
用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
用crosstool-ng建立arm-linux交叉工具链的介绍,最好手动安装一下termcap。 二、解压、打补丁(如果有)并建立工作目录。
make install
下面我只说说针对armv4t需要修改的地方,别的构架等有了板子测试再说:
3、关闭JAVA编译器,避免错误。
|
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)