zoukankan      html  css  js  c++  java
  • Linux下Qt+CUDA调试并运行

    Qt与CUDA相结合具体的操作主要修改qt项目中的配置文件pro。下面以测试的项目为例。

    因为这是一个测试案例,代码很简单,下面将这几个文件的代码贴出来,方面后面对应pro文件和Makefile文件中的内容。

    1.main.cpp

     1 #include "mainwindow.h"
     2 #include <QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     printf("main1 
    ");
     7 
     8     QApplication a(argc, argv);
     9     MainWindow w;
    10     w.show();
    11 
    12    printf("main2 
    ");
    13     return a.exec();
    14 }

    2.mainwindow.cpp

     1 #include "ui_mainwindow.h"
     2 #include "binlinearinterpolationcuda.h"
     3 
     4 
     5 MainWindow::MainWindow(QWidget *parent) :
     6     QMainWindow(parent),
     7     ui(new Ui::MainWindow)
     8 {
     9     ui->setupUi(this);
    10     printf("MainWindow 
    ");
    11 
    12     BinlinearInterpolation();//cuda代码的入口
    13 }
    14 
    15 MainWindow::~MainWindow()
    16 {
    17     delete ui;
    18 }

    3.binlinearinterpolationcuda.cu

     1 #include "binlinearinterpolationcuda.h"
     2 
     3 
     4 __global__ void Binlinear1_kernel(float *M,float *N,int *x,int *width1);
     5 __global__ void Binlinear2_kernel(float *N,float *V,int *y,int *width1);
     6 void BinlinearInterpolation(){
     7 /****/
     8     Binlinear1_kernel<<<gridDim,blockDim>>>(M,N,x,width1);
     9     Binlinear2_kernel<<<gridDim1,blockDim1>>>(N,V,y,width1);
    10 /***/
    11     
    12 }

    4.binlinearinterpolationcuda.h

     1 #ifndef BINLINEARINTERPOLATIONCUDA_H
     2 #define BINLINEARINTERPOLATIONCUDA_H
     3 #include "cuda_runtime.h"
     4 #include "device_launch_parameters.h"
     5 #include <stdio.h>
     6 #include "malloc.h"
     7 #define  WIDTH 11
     8 
     9 #define  HEIGHT 10
    10 #define  X_INTER 3
    11 #define  Y_INTER 3
    12 #define  BLOCK_SIZE 8
    13 
    14 void BinlinearInterpolation();
    15 #endif // BINLINEARINTERPOLATIONCUDA_H

    5.mainwindow.h

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include <QMainWindow>
     5 
     6 namespace Ui {
     7 class MainWindow;
     8 }
     9 
    10 class MainWindow : public QMainWindow
    11 {
    12     Q_OBJECT
    13 
    14 public:
    15     explicit MainWindow(QWidget *parent = 0);
    16     ~MainWindow();
    17 
    18     void creatMenu();
    19 
    20 private:
    21     Ui::MainWindow *ui;
    22  
    23 
    24 };
    25 
    26 #endif // MAINWINDOW_H

    6.pro文件的配置

     1 ######################################################################
     2 # Automatically generated by qmake (2.01a) Thu Nov 2 11:20:26 2017
     3 ######################################################################
     4 
     5 TEMPLATE = app
     6 TARGET = 
     7 DEPENDPATH += .
     8 INCLUDEPATH += . 
     9     /usr/local/include 
    10     /usr/include
    11 
    12 QT += core gui
    13 CONFIG += debug
    14 
    15 HEADERS += mainwindow.h 
    16     binlinearinterpolationcuda.h
    17 FORMS += mainwindow.ui
    18 SOURCES += main.cpp mainwindow.cpp
    19 LIBS += -L"/usr/local/lib" 
    20     -L"/usr/local/cuda/lib64" 
    21     -lcudart 
    22     -lcufft
    23 
    24 DEPENDPATH += .
    25 
    26 OTHER_FILES += binlinearinterpolationcuda.cu
    27 
    28 CUDA_SOURCES += binlinearinterpolationcuda.cu
    29 
    30 CUDA_SDK = "/usr/local/cuda"   # Path to cuda SDK install
    31 CUDA_DIR = "/usr/local/cuda"            # Path to cuda toolkit install
    32 SYSTEM_NAME = linux         # Depending on your system either 'Win32', 'x64', or 'Win64'
    33 SYSTEM_TYPE = 64            # '32' or '64', depending on your system
    34 CUDA_ARCH = sm_21           # Type of CUDA architecture, for example 'compute_10', 'compute_11', 'sm_10'
    35 NVCC_OPTIONS = --use_fast_math
    36 
    37 
    38 INCLUDEPATH += $$CUDA_DIR/include
    39 QMAKE_LIBDIR += $$CUDA_DIR/lib64/
    40 
    41 CUDA_OBJECTS_DIR = ./
    42 
    43 CUDA_LIBS = cudart cufft
    44 CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')
    45 NVCC_LIBS = $$join(CUDA_LIBS,' -l','-l', '')
    46 
    47 CONFIG(debug, debug|release) {
    48     # Debug mode
    49     cuda_d.input = CUDA_SOURCES
    50     cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
    51     cuda_d.commands = $$CUDA_DIR/bin/nvcc -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$NVCC_LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
    52     cuda_d.dependency_type = TYPE_C
    53     QMAKE_EXTRA_COMPILERS += cuda_d
    54 }
    55 else {
    56     # Release mode
    57     cuda.input = CUDA_SOURCES
    58     cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o
    59     cuda.commands = $$CUDA_DIR/bin/nvcc $$NVCC_OPTIONS $$CUDA_INC $$NVCC_LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -O3 -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
    60     cuda.dependency_type = TYPE_C
    61     QMAKE_EXTRA_COMPILERS += cuda
    62 }

    pro文件的配置是参照http://blog.163.com/qimo601@126/blog/static/15822093201401305739673/中提到的方法。该方法非常适用,比其他需要修改Makefile文件的方法更加实用。

    7.修改完pro文件后,就可以qmake->make->执行目标文件

    8.Makefile文件

      1 #############################################################################
      2 # Makefile for building: qtcuda
      3 # Generated by qmake (2.01a) (Qt 4.8.1) on: Thu Nov 2 19:39:13 2017
      4 # Project:  qtcuda.pro
      5 # Template: app
      6 # Command: /usr/local/Trolltech/Qt-4.8.1/bin/qmake -o Makefile qtcuda.pro
      7 #############################################################################
      8 
      9 ####### Compiler, tools and options
     10 
     11 CC            = gcc
     12 CXX           = g++
     13 DEFINES       = -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
     14 CFLAGS        = -m64 -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
     15 CXXFLAGS      = -m64 -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
     16 INCPATH       = -I/usr/local/Trolltech/Qt-4.8.1/mkspecs/linux-g++-64 -I. -I/usr/local/Trolltech/Qt-4.8.1/include/QtCore -I/usr/local/Trolltech/Qt-4.8.1/include/QtGui -I/usr/local/Trolltech/Qt-4.8.1/include -I. -I/usr/local/include -I/usr/include -I/usr/local/cuda/include -I. -I.
     17 LINK          = g++
     18 LFLAGS        = -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.1/lib
     19 LIBS          = $(SUBLIBS)  -L/usr/local/cuda/lib64/ -L/usr/local/Trolltech/Qt-4.8.1/lib -L/usr/local/lib -L/usr/local/cuda/lib64 -lcudart -lcufft -lQtGui -L/usr/local/Trolltech/Qt-4.8.1/lib -L/usr/X11R6/lib64 -lQtCore -lpthread 
     20 AR            = ar cqs
     21 RANLIB        = 
     22 QMAKE         = /usr/local/Trolltech/Qt-4.8.1/bin/qmake
     23 TAR           = tar -cf
     24 COMPRESS      = gzip -9f
     25 COPY          = cp -f
     26 SED           = sed
     27 COPY_FILE     = $(COPY)
     28 COPY_DIR      = $(COPY) -r
     29 STRIP         = strip
     30 INSTALL_FILE  = install -m 644 -p
     31 INSTALL_DIR   = $(COPY_DIR)
     32 INSTALL_PROGRAM = install -m 755 -p
     33 DEL_FILE      = rm -f
     34 SYMLINK       = ln -f -s
     35 DEL_DIR       = rmdir
     36 MOVE          = mv -f
     37 CHK_DIR_EXISTS= test -d
     38 MKDIR         = mkdir -p
     39 
     40 ####### Output directory
     41 
     42 OBJECTS_DIR   = ./
     43 
     44 ####### Files
     45 
     46 SOURCES       = main.cpp 
     47         mainwindow.cpp moc_mainwindow.cpp
     48 OBJECTS       = binlinearinterpolationcuda_cuda.o 
     49         main.o 
     50         mainwindow.o 
     51         moc_mainwindow.o
     52 DIST          = /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/unix.conf 
     53         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/linux.conf 
     54         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base.conf 
     55         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base-unix.conf 
     56         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-base.conf 
     57         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-unix.conf 
     58         /usr/local/Trolltech/Qt-4.8.1/mkspecs/qconfig.pri 
     59         /usr/local/Trolltech/Qt-4.8.1/mkspecs/modules/qt_webkit_version.pri 
     60         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_functions.prf 
     61         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_config.prf 
     62         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/exclusive_builds.prf 
     63         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_pre.prf 
     64         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/debug.prf 
     65         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_post.prf 
     66         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/gdb_dwarf_index.prf 
     67         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/warn_on.prf 
     68         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt.prf 
     69         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/thread.prf 
     70         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/moc.prf 
     71         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/resources.prf 
     72         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/uic.prf 
     73         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/yacc.prf 
     74         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/lex.prf 
     75         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/include_source_dir.prf 
     76         qtcuda.pro
     77 QMAKE_TARGET  = qtcuda
     78 DESTDIR       = 
     79 TARGET        = qtcuda
     80 
     81 first: all
     82 ####### Implicit rules
     83 
     84 .SUFFIXES: .o .c .cpp .cc .cxx .C
     85 
     86 .cpp.o:
     87     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
     88 
     89 .cc.o:
     90     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
     91 
     92 .cxx.o:
     93     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
     94 
     95 .C.o:
     96     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
     97 
     98 .c.o:
     99     $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
    100 
    101 ####### Build rules
    102 
    103 all: Makefile $(TARGET)
    104 
    105 $(TARGET): ui_mainwindow.h $(OBJECTS)  
    106     $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
    107     { test -n "$(DESTDIR)" && DESTDIR="$(DESTDIR)" || DESTDIR=.; } && test $$(gdb --version | sed -e 's,[^0-9]+([0-9]).([0-9]).*,12,;q') -gt 72 && gdb --nx --batch --quiet -ex 'set confirm off' -ex "save gdb-index $$DESTDIR" -ex quit '$(TARGET)' && test -f $(TARGET).gdb-index && objcopy --add-section '.gdb_index=$(TARGET).gdb-index' --set-section-flags '.gdb_index=readonly' '$(TARGET)' '$(TARGET)' && rm -f $(TARGET).gdb-index || true
    108 
    109 Makefile: qtcuda.pro  /usr/local/Trolltech/Qt-4.8.1/mkspecs/linux-g++-64/qmake.conf /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/unix.conf 
    110         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/linux.conf 
    111         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base.conf 
    112         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base-unix.conf 
    113         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-base.conf 
    114         /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-unix.conf 
    115         /usr/local/Trolltech/Qt-4.8.1/mkspecs/qconfig.pri 
    116         /usr/local/Trolltech/Qt-4.8.1/mkspecs/modules/qt_webkit_version.pri 
    117         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_functions.prf 
    118         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_config.prf 
    119         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/exclusive_builds.prf 
    120         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_pre.prf 
    121         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/debug.prf 
    122         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_post.prf 
    123         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/gdb_dwarf_index.prf 
    124         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/warn_on.prf 
    125         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt.prf 
    126         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/thread.prf 
    127         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/moc.prf 
    128         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/resources.prf 
    129         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/uic.prf 
    130         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/yacc.prf 
    131         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/lex.prf 
    132         /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/include_source_dir.prf 
    133         /usr/local/Trolltech/Qt-4.8.1/lib/libQtGui.prl 
    134         /usr/local/Trolltech/Qt-4.8.1/lib/libQtCore.prl
    135     $(QMAKE) -o Makefile qtcuda.pro
    136 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/unix.conf:
    137 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/linux.conf:
    138 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base.conf:
    139 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/gcc-base-unix.conf:
    140 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-base.conf:
    141 /usr/local/Trolltech/Qt-4.8.1/mkspecs/common/g++-unix.conf:
    142 /usr/local/Trolltech/Qt-4.8.1/mkspecs/qconfig.pri:
    143 /usr/local/Trolltech/Qt-4.8.1/mkspecs/modules/qt_webkit_version.pri:
    144 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_functions.prf:
    145 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt_config.prf:
    146 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/exclusive_builds.prf:
    147 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_pre.prf:
    148 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/debug.prf:
    149 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/default_post.prf:
    150 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/gdb_dwarf_index.prf:
    151 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/warn_on.prf:
    152 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/qt.prf:
    153 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/unix/thread.prf:
    154 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/moc.prf:
    155 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/resources.prf:
    156 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/uic.prf:
    157 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/yacc.prf:
    158 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/lex.prf:
    159 /usr/local/Trolltech/Qt-4.8.1/mkspecs/features/include_source_dir.prf:
    160 /usr/local/Trolltech/Qt-4.8.1/lib/libQtGui.prl:
    161 /usr/local/Trolltech/Qt-4.8.1/lib/libQtCore.prl:
    162 qmake:  FORCE
    163     @$(QMAKE) -o Makefile qtcuda.pro
    164 
    165 dist: 
    166     @$(CHK_DIR_EXISTS) .tmp/qtcuda1.0.0 || $(MKDIR) .tmp/qtcuda1.0.0 
    167     $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/qtcuda1.0.0/ && $(COPY_FILE) --parents binlinearinterpolationcuda.cu .tmp/qtcuda1.0.0/ && $(COPY_FILE) --parents mainwindow.h binlinearinterpolationcuda.h .tmp/qtcuda1.0.0/ && $(COPY_FILE) --parents main.cpp mainwindow.cpp .tmp/qtcuda1.0.0/ && $(COPY_FILE) --parents mainwindow.ui .tmp/qtcuda1.0.0/ && (cd `dirname .tmp/qtcuda1.0.0` && $(TAR) qtcuda1.0.0.tar qtcuda1.0.0 && $(COMPRESS) qtcuda1.0.0.tar) && $(MOVE) `dirname .tmp/qtcuda1.0.0`/qtcuda1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/qtcuda1.0.0
    168 
    169 
    170 clean:compiler_clean 
    171     -$(DEL_FILE) $(OBJECTS)
    172     -$(DEL_FILE) *~ core *.core
    173 
    174 
    175 ####### Sub-libraries
    176 
    177 distclean: clean
    178     -$(DEL_FILE) $(TARGET) 
    179     -$(DEL_FILE) Makefile
    180 
    181 
    182 check: first
    183 
    184 mocclean: compiler_moc_header_clean compiler_moc_source_clean
    185 
    186 mocables: compiler_moc_header_make_all compiler_moc_source_make_all
    187 
    188 compiler_cuda_d_make_all: binlinearinterpolationcuda_cuda.o
    189 compiler_cuda_d_clean:
    190     -$(DEL_FILE) binlinearinterpolationcuda_cuda.o
    191 binlinearinterpolationcuda_cuda.o: binlinearinterpolationcuda.h 
    192         binlinearinterpolationcuda.cu
    193     /usr/local/cuda/bin/nvcc -D_DEBUG --use_fast_math -I"." -I"/usr/local/include" -I"/usr/include" -I"/usr/local/cuda/include" -lcudart -lcufft --machine 64 -arch=sm_21 -c -o binlinearinterpolationcuda_cuda.o binlinearinterpolationcuda.cu
    194 
    195 compiler_moc_header_make_all: moc_mainwindow.cpp
    196 compiler_moc_header_clean:
    197     -$(DEL_FILE) moc_mainwindow.cpp
    198 moc_mainwindow.cpp: mainwindow.h
    199     /usr/local/Trolltech/Qt-4.8.1/bin/moc $(DEFINES) $(INCPATH) mainwindow.h -o moc_mainwindow.cpp
    200 
    201 compiler_rcc_make_all:
    202 compiler_rcc_clean:
    203 compiler_image_collection_make_all: qmake_image_collection.cpp
    204 compiler_image_collection_clean:
    205     -$(DEL_FILE) qmake_image_collection.cpp
    206 compiler_moc_source_make_all:
    207 compiler_moc_source_clean:
    208 compiler_uic_make_all: ui_mainwindow.h
    209 compiler_uic_clean:
    210     -$(DEL_FILE) ui_mainwindow.h
    211 ui_mainwindow.h: mainwindow.ui
    212     /usr/local/Trolltech/Qt-4.8.1/bin/uic mainwindow.ui -o ui_mainwindow.h
    213 
    214 compiler_yacc_decl_make_all:
    215 compiler_yacc_decl_clean:
    216 compiler_yacc_impl_make_all:
    217 compiler_yacc_impl_clean:
    218 compiler_lex_make_all:
    219 compiler_lex_clean:
    220 compiler_clean: compiler_cuda_d_clean compiler_moc_header_clean compiler_uic_clean 
    221 
    222 ####### Compile
    223 
    224 main.o: main.cpp mainwindow.h
    225     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
    226 
    227 mainwindow.o: mainwindow.cpp mainwindow.h 
    228         ui_mainwindow.h 
    229         binlinearinterpolationcuda.h
    230     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o mainwindow.cpp
    231 
    232 moc_mainwindow.o: moc_mainwindow.cpp 
    233     $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp
    234 
    235 ####### Install
    236 
    237 install:   FORCE
    238 
    239 uninstall:   FORCE
    240 
    241 FORCE:

    有兴趣的同学,可以根据pro文件中的内容都Makefile中的代码。

     9.有关pro文件的配置情况,可以参看“http://blog.csdn.net/liang19890820/article/details/51774724”

  • 相关阅读:
    Flask路由系统
    Flask配置方式
    Flask应用启动流程
    Flask简介及使用
    python调用支付宝支付接口
    python调用腾讯云短信接口
    Celery简介以及Django中使用celery
    django中使用redis
    Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
    git操作
  • 原文地址:https://www.cnblogs.com/zhangjxblog/p/7774800.html
Copyright © 2011-2022 走看看