1.ccacheԴ?源码?
2.LLVM(MLIR)安装编译
3.å¦ä½ä½¿ç¨arm-linux-androideabi-addr2line
4.androidç³»ç»ç¼è¯è½ç¨åå¸å¼ç¼è¯å
5.如何评价xmake?
ccacheԴ??
随着 C++ 项目的持续扩大,编译效率成为了一个大问题。源码那么,源码如何在不修改源码或更换硬件的源码情况下显著提升编译速度呢?这里有一些高效的方法,可以让你的源码编译速度飞跃提升。
首先,源码短视频app 源码尝试启用多核编译。源码通过在 Qt Creator 中设置环境变量“MAKEFLAGS=-j”,源码可以充分利用机器性能,源码加快编译过程。源码这里的源码数字应根据电脑的 CPU 核心数和线程数来调整,例如,源码如果是源码 8 核 线程,建议设置为 。源码app rtmp 源码
如果需要针对特定项目进行优化,源码可以利用 qmake 或 cmake 来设置并行工作线程的个数。在 qmake 中,通过调整“Parallel jobs”或“Make arguments”即可。在 cmake 的 CMakeLists.txt 文件中,添加相关配置,将 ccache 作为编译命令和链接命令的启动器。
使用 ccache 编译器缓存是一个有力的工具,它能高速缓存编译生成的信息,利用高速缓存来节省解析头文件所需的时间。安装 ccache 并按照上述方法进行配置后,你会发现编译速度显著提升,有时甚至可以达到令人难以置信的输入注入源码提升效果,比如从最初的 秒优化到仅需 1 秒,效率提升了近 倍。
通过采用这些方法,你的 C++ 项目编译速度将会显著提高,节省大量时间。记得在配置完成后重新编译,以验证优化效果。
LLVM(MLIR)安装编译
本文旨在为有兴趣自行安装和编译 LLVM(利用 MLIR 作为后端输出的主要方式)的读者提供一份详细指南。在实际操作过程中,可能会遇到一些理解上的偏差,欢迎指正。由于目标是能在 x 和 RISCV 上运行,所有配置均基于 i7-H 笔记本,openwrt固件源码运行 Ubuntu . LTS 系统。
以下是编译配置的步骤:
第一步:下载 LLVM 的源码。确保已安装 git,若未安装,请执行 sudo apt-get install git。创建名为 LLVM 的文件夹存放 LLVM 源码,并将源码文件夹命名为 llvm-project。接着,通过 git 下载 LLVM 源码。
第二步:建立用于 LLVM 编译的文件夹。为了区分编译产生的文件和源文件,建立名为 build 的文件夹。在教程中,嵩嵩源码每段代码都以 cd 到主文件夹,然后进入工程文件夹的方式进行,便于理解。
第三步:进入 build 文件夹,完成编译配置。此过程大致分为如何编译、编译什么、为谁编三个部分。具体参数如下:
如何编译:指定编译器类型、线程数及目标地址。例如,使用 -DLLVM_PARALLEL_COMPILE_JOBS=### 设置并行编译工作数,使用 -DCMAKE_INSTALL_PREFIX=*** 指定安装路径,使用 -DLLVM_CCACHE_BUILD=### 选择是否使用 ccache。选择 C 和 C++ 编译器,如 -DCMAKE_C_COMPILER=### 和 -DCMAKE_CXX_COMPILER=###。启用 LLD 作为链接器以提高效率,可通过 -DLLVM_ENABLE_LLD=ON 实现。
编译什么:设置编译版本类型,如 Debug、Release 等,使用 -DCMAKE_BUILD_TYPE=###。同时,通过 -DLLVM_ENABLE_PROJECTS=### 配置需要编译的子项目。
为谁编:指定目标平台,如 x 和 RISCV,使用 -DLLVM_TARGETS_TO_BUILD=###。可选平台包括但不限于:AArch、AMDGPU、ARM、AVR、BPF、Hexagon 等。
注意:在完成编译配置后,执行编译命令。在遇到可能的问题时,检查错误信息并根据需要调整参数。最后,根据实际需求进行文件路径、编译选项等的调整。
以上步骤和参数配置将帮助您成功安装和编译 LLVM,满足在 x 和 RISCV 上运行的需求。通过本文提供的指南,希望能为您的项目开发提供便利。如有任何疑问或需要进一步的帮助,请随时提问。
å¦ä½ä½¿ç¨arm-linux-androideabi-addr2line
1.å°ndkä¸çarm-linux-androideabi-addr2lineå¯æ§è¡æ件çè·¯å¾å å ¥é ç½®æ件~/.bashrcä¸ï¼ä¾å¦ï¼
export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x/bin
2.使é ç½®çæï¼source ~/.bashrc
3.使ç¨å·¥å ·ãä¾å¦ï¼arm-linux-androideabi-addr2line -C -f -e ~/workspace/DLNA/libs/armeabi/libctrlpt.so deb4
å ¶ä¸ï¼deb4为å æ ä¿¡æ¯ä¸pcçå¼ã
androidåºç¨å´©æºçè°è¯æ¹æ³
æ两ç§æ¹æ³å¯ä»¥åæ crash çå æ ä¿¡æ¯
1 googleæä¾äºä¸ä¸ªpythonèæ¬ï¼å¯ä»¥ä»
/p/android-ndk-stacktrace-analyzer/
ä¸è½½è¿ä¸ªpythonèæ¬ï¼ç¶åä½¿ç¨ adb logcat -d > logfile å¯¼åº crash çlog,
ä½¿ç¨ arm-eabi-objdump ä½äºbuild/prebuilt/linux-x/arm-eabi-4.2.1/binä¸é¢
æsoæexe转æ¢ææ±ç¼ä»£ç ï¼å¦ï¼arm-eabi-objdump -S mylib.so > mylib.asm,
使ç¨èæ¬
python parse_stack.py <asm-file> <logcat-file>
2 ç´æ¥ä½¿ç¨NDKä¸é¢çarm-linux-androideabi-addr2line
(D:\android-ndk-r8\toolchains\arm-linux-
androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-addr2line.exe)
ä¾å¦ï¼arm-linux-androideabi-addr2line -C -f -e libxxx.so 0x#####(address)
androidè°è¯å·¥å ·addr2line使ç¨è¡¥å
使ç¨addr2line追踪èªæå¨æåº(soæ件)çbug, è¡¥å :
解å³åºç° ?:0 , 没æ³å±ç¤ºæºä»£ç è¡æ°çé®é¢
å¨Android.mk æ件ä¸:
Java代ç
LOCAL_CFLAGS
:=
-D__STDC_CONSTANT_MACROS
-Wl,-Map=test.map
-g
è¡¥å 2个ç¼è¯åæ° -Wl,-Map=test.map -g .
å¢å gccè¦ååè°è¯æ å¿
arm-linux-androideabi-addr2line -C -f -e /项ç®ç®å½/obj/local/armeabi/libfaa_jni.so e
tip: 1,注æè°è¯æ件çä½ç½®å¨objç®å½ä¸,并élibsç®å½ä¸çæçsoæ件
2,e 为åºéçæºå¶ä½ç½®
è¿æï¼
å¨jni/ç®å½ä¸å¢å Application.mk æä»¶ï¼ ä¿®æ¹ä¸ºdebug 模å¼ï¼è¿è¡è°è¯ APP_OPTIM := debug
androidç³»ç»ç¼è¯è½ç¨åå¸å¼ç¼è¯å
项ç®è¶æ¥è¶å¤§ï¼æ¯æ¬¡éè¦éæ°ç¼è¯æ´ä¸ªé¡¹ç®é½æ¯ä¸ä»¶å¾æµªè´¹æ¶é´çäºæ ãResearchäºä¸ä¸ï¼æ¾å°ä»¥ä¸å¯ä»¥å¸®å©æé«é度çæ¹æ³ï¼æ»ç»ä¸ä¸ã
1. 使ç¨tmpfsæ¥ä»£æ¿é¨åIO读å
ãã2.ccacheï¼å¯ä»¥å°ccacheçç¼åæ件设置å¨tmpfsä¸ï¼ä½æ¯è¿æ ·çè¯ï¼æ¯æ¬¡å¼æºåï¼ccacheçç¼åæ件ä¼ä¸¢å¤±
ãã3.distcc,å¤æºå¨ç¼è¯
ãã4.å°å±å¹è¾åºæå°å°å åæ件æè /dev/nullä¸ï¼é¿å ç»ç«¯è®¾å¤ï¼æ ¢é设å¤ï¼ææ ¢é度ã
ãtmpfs
ããæ人说å¨Windowsä¸ç¨äºRAMDiskæä¸ä¸ªé¡¹ç®ç¼è¯æ¶é´ä»4.5å°æ¶åå°å°äº5åéï¼ä¹è®¸è¿ä¸ªæ°åæ¯æç¹å¤¸å¼ äºï¼ä¸è¿ç²æ³æ³ï¼ææ件æ¾å°å åä¸åç¼è¯åºè¯¥æ¯æ¯å¨ç£çä¸å¿«å¤äºå§ï¼å°¤å ¶å¦æç¼è¯å¨éè¦çæå¾å¤ä¸´æ¶æ件çè¯ã
ããè¿ä¸ªåæ³çå®ç°ææ¬æä½ï¼å¨Linuxä¸ï¼ç´æ¥mountä¸ä¸ªtmpfså°±å¯ä»¥äºãèä¸å¯¹æç¼è¯çå·¥ç¨æ²¡æä»»ä½è¦æ±ï¼ä¹ä¸ç¨æ¹å¨ç¼è¯ç¯å¢ã
ããmount -t tmpfs tmpfs ~/build -o size=1G
ããç¨2.6..2çLinux Kernelæ¥æµè¯ä¸ä¸ç¼è¯é度ï¼
ããç¨ç©çç£çï¼åç§
ããç¨tmpfsï¼åç§
ããåâ¦â¦æ²¡ä»ä¹ååãçæ¥ç¼è¯æ ¢å¾å¤§ç¨åº¦ä¸ç¶é¢å¹¶ä¸å¨IOä¸é¢ãä½å¯¹äºä¸ä¸ªå®é 项ç®æ¥è¯´ï¼ç¼è¯è¿ç¨ä¸å¯è½è¿ä¼ææå çIOå¯éçæä½ï¼æ以åªè¦å¯è½ï¼ç¨tmpfsæ¯æçæ 害çãå½ç¶å¯¹äºå¤§é¡¹ç®æ¥è¯´ï¼ä½ éè¦æ足å¤çå åæè½è´æ å¾èµ·è¿ä¸ªtmpfsçå¼éã
ããmake -j
ããæ¢ç¶IOä¸æ¯ç¶é¢ï¼é£CPUå°±åºè¯¥æ¯ä¸ä¸ªå½±åç¼è¯é度çéè¦å ç´ äºã
ããç¨make -j带ä¸ä¸ªåæ°ï¼å¯ä»¥æ项ç®å¨è¿è¡å¹¶è¡ç¼è¯ï¼æ¯å¦å¨ä¸å°åæ ¸çæºå¨ä¸ï¼å®å ¨å¯ä»¥ç¨make -j4ï¼è®©makeæå¤å 许4个ç¼è¯å½ä»¤åæ¶æ§è¡ï¼è¿æ ·å¯ä»¥æ´ææçå©ç¨CPUèµæºã
ããè¿æ¯ç¨Kernelæ¥æµè¯ï¼
ããç¨makeï¼ åç§
ããç¨make -j4ï¼åç§
ããç¨make -j8ï¼åç§
ããç±æ¤çæ¥ï¼å¨å¤æ ¸CPUä¸ï¼éå½çè¿è¡å¹¶è¡ç¼è¯è¿æ¯å¯ä»¥ææ¾æé«ç¼è¯é度çãä½å¹¶è¡çä»»å¡ä¸å®å¤ªå¤ï¼ä¸è¬æ¯ä»¥CPUçæ ¸å¿æ°ç®ç两å为å®ã
ããä¸è¿è¿ä¸ªæ¹æ¡ä¸æ¯å®å ¨æ²¡æcostçï¼å¦æ项ç®çMakefileä¸è§èï¼æ²¡ææ£ç¡®ç设置好ä¾èµå ³ç³»ï¼å¹¶è¡ç¼è¯çç»æå°±æ¯ç¼è¯ä¸è½æ£å¸¸è¿è¡ãå¦æä¾èµå ³ç³»è®¾ç½®è¿äºä¿å®ï¼åå¯è½æ¬èº«ç¼è¯çå¯å¹¶è¡åº¦å°±ä¸éäºï¼ä¹ä¸è½åå¾æä½³çææã
ããccache
ccacheå·¥ä½åçï¼
ccacheä¹æ¯ä¸ä¸ªç¼è¯å¨é©±å¨å¨ã第ä¸è¶ç¼è¯æ¶ccacheç¼åäºGCCçâ-Eâè¾åºãç¼è¯é项以å.oæ件å°$HOME/.ccacheã第äºæ¬¡ç¼è¯æ¶å°½éå©ç¨ç¼åï¼å¿ è¦æ¶æ´æ°ç¼åãæ以å³ä½¿"make clean; make"ä¹è½ä»ä¸è·å¾å¥½å¤ãccacheæ¯ç»è¿ä»ç»ç¼åçï¼ç¡®ä¿äºä¸ç´æ¥ä½¿ç¨GCCè·å¾å®å ¨ç¸åçè¾åºã
ããccacheç¨äºæç¼è¯çä¸é´ç»æè¿è¡ç¼åï¼ä»¥ä¾¿å¨å次ç¼è¯çæ¶åå¯ä»¥èçæ¶é´ãè¿å¯¹äºç©Kernelæ¥è¯´å®å¨æ¯å好ä¸è¿äºï¼å 为ç»å¸¸éè¦ä¿®æ¹ä¸äºKernelç代ç ï¼ç¶ååéæ°ç¼è¯ï¼èè¿ä¸¤æ¬¡ç¼è¯å¤§é¨åä¸è¥¿å¯è½é½æ²¡æåçååã对äºå¹³æ¶å¼å项ç®æ¥è¯´ï¼ä¹æ¯ä¸æ ·ã为ä»ä¹ä¸æ¯ç´æ¥ç¨makeææ¯æçå¢éç¼è¯å¢ï¼è¿æ¯å 为ç°å®ä¸ï¼å 为Makefileçä¸è§èï¼å¾å¯è½è¿ç§âèªæâçæ¹æ¡æ ¹æ¬ä¸è½æ£å¸¸å·¥ä½ï¼åªææ¯æ¬¡make cleanåmakeæè¡ã
ããå®è£ å®ccacheåï¼å¯ä»¥å¨/usr/local/binä¸å»ºç«gccï¼g++ï¼c++ï¼ccçsymbolic linkï¼é¾å°/usr/bin/ccacheä¸ãæ»ä¹ç¡®è®¤ç³»ç»å¨è°ç¨gccçå½ä»¤æ¶ä¼è°ç¨å°ccacheå°±å¯ä»¥äºï¼é常æ åµä¸/usr/local /binä¼å¨PATHä¸æå¨/usr/binåé¢ï¼ã
ããå®è£ çå¦å¤ä¸ç§æ¹æ³ï¼
ããvi ~/.bash_profile
ããæ/usr/lib/ccache/binè·¯å¾å å°PATHä¸
ããPATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
ããè¿æ ·æ¯æ¬¡å¯å¨g++çæ¶åé½ä¼å¯å¨/usr/lib/ccache/bin/g++ï¼èä¸ä¼å¯å¨/usr/bin/g++
ããææè·ä½¿ç¨å½ä»¤è¡ccache g++ææä¸æ ·
ããè¿æ ·æ¯æ¬¡ç¨æ·ç»å½æ¶ï¼ä½¿ç¨g++ç¼è¯å¨æ¶ä¼èªå¨å¯å¨ccache
ãã继ç»æµè¯ï¼
ããç¨ccacheç第ä¸æ¬¡ç¼è¯(make -j4)ï¼åç§
ããç¨ccacheç第äºæ¬¡ç¼è¯(make -j4)ï¼8åç§
ããç¨ccacheç第ä¸æ¬¡ç¼è¯(ä¿®æ¹è¥å¹²é ç½®ï¼make -j4)ï¼åç§
çæ¥ä¿®æ¹é ç½®ï¼ææ¹äºCPUç±»å...ï¼å¯¹ccacheçå½±åæ¯å¾å¤§çï¼å 为åºæ¬å¤´æ件åçåååï¼å°±å¯¼è´ææç¼åæ°æ®é½æ æäºï¼å¿ é¡»é头æ¥åãä½å¦æåªæ¯ä¿®æ¹ä¸äº.cæ件ç代ç ï¼ccacheçææè¿æ¯ç¸å½ææ¾çãèä¸ä½¿ç¨ccache对项ç®æ²¡æç¹å«çä¾èµï¼å¸ç½²ææ¬å¾ä½ï¼è¿å¨æ¥å¸¸å·¥ä½ä¸å¾å®ç¨ã
ããå¯ä»¥ç¨ccache -sæ¥æ¥çcacheç使ç¨åå½ä¸æ åµï¼
ããcache directoryãããããããããã /home/lifanxi/.ccachecache hitããããããããããããã cache missãããããããããããã called for linkããããããããããã not a C/C++ fileã ããããããã no input fileããããããããããã files in cacheãããããããããã cache sizeãããããããããããã .7 Mbytesmax cache sizeãããããããããã .6 Mbytes
ããå¯ä»¥çå°ï¼æ¾ç¶åªæ第äºç¼æ¬¡è¯æ¶cacheå½ä¸äºï¼cache missæ¯ç¬¬ä¸æ¬¡å第ä¸æ¬¡ç¼è¯å¸¦æ¥çã两次cacheå ç¨äº.7Mçç£çï¼è¿æ¯å®å ¨å¯ä»¥æ¥åçã
ããdistcc
ããä¸å°æºå¨çè½åæéï¼å¯ä»¥èåå¤å°çµèä¸èµ·æ¥ç¼è¯ãè¿å¨å ¬å¸çæ¥å¸¸å¼åä¸ä¹æ¯å¯è¡çï¼å 为å¯è½æ¯ä¸ªå¼å人åé½æèªå·±çå¼åç¼è¯ç¯å¢ï¼å®ä»¬çç¼è¯å¨çæ¬ä¸è¬æ¯ä¸è´çï¼å ¬å¸çç½ç»ä¹éå¸¸å ·æè¾å¥½çæ§è½ãè¿æ¶å°±æ¯distcc大æ¾èº«æçæ¶åäºã
ãã使ç¨distccï¼å¹¶ä¸åæ³è±¡ä¸é£æ ·è¦æ±æ¯å°çµèé½å ·æå®å ¨ä¸è´çç¯å¢ï¼å®åªè¦æ±æºä»£ç å¯ä»¥ç¨make -j并è¡ç¼è¯ï¼å¹¶ä¸åä¸åå¸å¼ç¼è¯ççµèç³»ç»ä¸å ·æç¸åçç¼è¯å¨ãå 为å®çåçåªæ¯æé¢å¤ç好çæºæ件ååå°å¤å°è®¡ç®æºä¸ï¼é¢å¤çãç¼è¯åçç®æ æ件çé¾æ¥åå ¶å®é¤ç¼è¯ä»¥å¤çå·¥ä½ä»ç¶æ¯å¨åèµ·ç¼è¯ç主æ§çµèä¸å®æï¼æ以åªè¦æ±åèµ·ç¼è¯çé£å°æºå¨å ·å¤ä¸å¥å®æ´çç¼è¯ç¯å¢å°±å¯ä»¥äºã
ããdistccå®è£ åï¼å¯ä»¥å¯å¨ä¸ä¸å®çæå¡ï¼
ãã/usr/bin/distccd --daemon --allow ..0.0/
ããé»è®¤ç端å£å 许æ¥èªåä¸ä¸ªç½ç»çdistccè¿æ¥ã
ããç¶å设置ä¸ä¸DISTCC_HOSTSç¯å¢åéï¼è®¾ç½®å¯ä»¥åä¸ç¼è¯çæºå¨å表ãé常localhostä¹åä¸ç¼è¯ï¼ä½å¦æå¯ä»¥åä¸ç¼è¯çæºå¨å¾å¤ï¼åå¯ä»¥ælocalhostä»è¿ä¸ªå表ä¸å»æï¼è¿æ ·æ¬æºå°±å®å ¨åªæ¯è¿è¡é¢å¤çãåååé¾æ¥äºï¼ç¼è¯é½å¨å«çæºå¨ä¸å®æãå 为æºå¨å¾å¤æ¶ï¼localhostçå¤çè´æ å¾éï¼æ以å®å°±ä¸åâå ¼èâç¼è¯äºã
ããexport DISTCC_HOSTS="localhost ...1 ...2 ...3"
ããç¶åä¸ccache类似æg++ï¼gccç常ç¨çå½ä»¤é¾æ¥å°/usr/bin/distccä¸å°±å¯ä»¥äºã
ããå¨makeçæ¶åï¼ä¹å¿ é¡»ç¨-jåæ°ï¼ä¸è¬æ¯åæ°å¯ä»¥ç¨ææåç¨ç¼è¯ç计ç®æºCPUå æ ¸æ»æ°ç两åå为并è¡çä»»å¡æ°ã
ããåæ ·æµè¯ä¸ä¸ï¼
ããä¸å°åæ ¸è®¡ç®æºï¼make -j4ï¼åç§
ãã两å°åæ ¸è®¡ç®æºï¼make -j4ï¼åç§
ãã两å°åæ ¸è®¡ç®æºï¼make -j8ï¼åç§
ããè·æå¼å§ç¨ä¸å°åæ ¸æ¶çåéç¸æ¯ï¼è¿æ¯å¿«äºä¸å°çãå¦æææ´å¤ç计ç®æºå å ¥ï¼ä¹å¯ä»¥å¾å°æ´å¥½çææã
ããå¨ç¼è¯è¿ç¨ä¸å¯ä»¥ç¨distccmon-textæ¥æ¥çç¼è¯ä»»å¡çåé æ åµãdistccä¹å¯ä»¥ä¸ccacheåæ¶ä½¿ç¨ï¼éè¿è®¾ç½®ä¸ä¸ªç¯å¢åéå°±å¯ä»¥åå°ï¼é常æ¹ä¾¿ã
ããæ»ç»ä¸ä¸ï¼
ãã tmpfsï¼ è§£å³IOç¶é¢ï¼å åå©ç¨æ¬æºå åèµæº
ããmake -jï¼ å åå©ç¨æ¬æºè®¡ç®èµæº
ããdistccï¼ å©ç¨å¤å°è®¡ç®æºèµæº
ããccacheï¼ åå°éå¤ç¼è¯ç¸å代ç çæ¶é´
ããè¿äºå·¥å ·ç好å¤é½å¨äºå¸ç½²çææ¬ç¸å¯¹è¾ä½ï¼ç»¼åå©ç¨è¿äºå·¥å ·ï¼å°±å¯ä»¥è½»è½»æ¾æ¾çèçç¸å½å¯è§çæ¶é´ãä¸é¢ä»ç»çé½æ¯è¿äºå·¥å ·æåºæ¬çç¨æ³ï¼æ´å¤çç¨æ³å¯ä»¥åèå®ä»¬åèªçman pageã
ãã5.è¿ææéæ¹æ³æ¯æå±å¹è¾åºéå®åå°å åæ件æ/dev/null,å 对ç»ç«¯è®¾å¤(æ ¢é设å¤)çé»å¡åæä½ä¹ä¼ææ ¢é度ãæ¨èå åæ件ï¼è¿æ ·åçé误æ¶ï¼è½å¤æ¥çã
如何评价xmake?
xmake采用默认直接构建模式,无需依赖makefile和make工具,能自动处理头文件依赖,并开启多任务加速构建流程。内置构建、打包、安装步骤,提供插件扩展机制,支持cmake、premake的makefile和vs工程生成,方便扩展与维护。已有多种内置实用插件。
简单工程无需makefile文件,xmake直接分析源码编译运行,适用于快速测试临时代码。复杂工程则采用xmake.lua描述文件,利用lua简洁易维护的语法进行维护。
经过数年迭代,xmake拥有了强大的包管理系统。支持远程编译、分布式编译,并内置本地缓存与远程缓存功能。
简言之,xmake集合了Make/Ninja、CMake/Meson、Vcpkg/Conan以及distcc、ccache等核心功能,实现高效、灵活的构建与包管理。
2024-12-28 21:031052人浏览
2024-12-28 20:172047人浏览
2024-12-28 19:422338人浏览
2024-12-28 19:00222人浏览
2024-12-28 18:522970人浏览
2024-12-28 18:34191人浏览
台灣人愛吃海鮮,也懂吃海鮮,在山海之鄉花蓮,有一間開業超過25年的海鮮餐廳,現撈現殺的螃蟹跟龍蝦,以及紅蟳粉絲煲,是饕客必點的菜色,但是海洋主廚有感於近年來,全球漁獲資源大減,他也開始推動永續食魚教育
1.四川在线教育系统源码2.重庆教育系统培训系统源码3.大黄蜂云课堂网校系统源码下载,开源下载4.重庆网校系统源码5.天津教育系统培训系统源码6.深圳培训系统下载四川在线教育系统源码 在线教教育系
1.tvb淘宝直播在哪看2.可以在电视上看淘宝直播吗3.电视淘宝可以看直播吗4.想在淘宝直播,要怎么做啊tvb淘宝直播在哪看 TVB淘宝直播是香港电视广播有限公司TVB)与淘宝合作的一项直播服务,