• 在 msys2/mingw 下安装及编译 opencv


    最简单就是直接安装

    pacman -S mingw-w64-x86_64-opencv

    脚本中最好使用环境变量 ${MINGW_PACKAGE_PREFIX} 适配

    pacman -S --needed ${MINGW_PACKAGE_PREFIX}-opencv

    以下记录一下编译的过程

    一)安装编译工具及第三方库

    注意:一定要安装 mingw-w64-x86_64-cmake  而不是 cmake,即不要执行 “pacman -S cmake”

    否则会产生 “System is unknown to cmake, create 。。。” 报错信息

    1. pacman -S --needed base-devel vim tar wget unzip protobuf
    2. pacman -S --needed \
    3. ${MINGW_PACKAGE_PREFIX}-cmake \
    4. ${MINGW_PACKAGE_PREFIX}-gcc \
    5. ${MINGW_PACKAGE_PREFIX}-toolchain \
    6. ${MINGW_PACKAGE_PREFIX}-boost \
    7. ${MINGW_PACKAGE_PREFIX}-ccache \
    8. ${MINGW_PACKAGE_PREFIX}-eigen3 \
    9. ${MINGW_PACKAGE_PREFIX}-gcc-libgfortran \
    10. ${MINGW_PACKAGE_PREFIX}-gtk3 \
    11. ${MINGW_PACKAGE_PREFIX}-julia \
    12. ${MINGW_PACKAGE_PREFIX}-ogre3d \
    13. ${MINGW_PACKAGE_PREFIX}-python \
    14. ${MINGW_PACKAGE_PREFIX}-python2 \
    15. ${MINGW_PACKAGE_PREFIX}-python-pip \
    16. ${MINGW_PACKAGE_PREFIX}-python-numpy \
    17. ${MINGW_PACKAGE_PREFIX}-vtk
    18. pacman -S --needed \
    19. ${MINGW_PACKAGE_PREFIX}-libpng \
    20. ${MINGW_PACKAGE_PREFIX}-libjpeg \
    21. ${MINGW_PACKAGE_PREFIX}-libtiff \
    22. ${MINGW_PACKAGE_PREFIX}-libwebp
    23. pacman -S --needed \
    24. ${MINGW_PACKAGE_PREFIX}-dlib \
    25. ${MINGW_PACKAGE_PREFIX}-ffmpeg \
    26. ${MINGW_PACKAGE_PREFIX}-harfbuzz \
    27. ${MINGW_PACKAGE_PREFIX}-lapack \
    28. ${MINGW_PACKAGE_PREFIX}-openblas \
    29. ${MINGW_PACKAGE_PREFIX}-opencl-clhpp \
    30. ${MINGW_PACKAGE_PREFIX}-opencl-headers \
    31. ${MINGW_PACKAGE_PREFIX}-opencl-icd \
    32. ${MINGW_PACKAGE_PREFIX}-openmp
    33. # optional
    34. pacman -S --needed \
    35. ${MINGW_PACKAGE_PREFIX}-tesseract-ocr \
    36. ${MINGW_PACKAGE_PREFIX}-tesseract-data-chi_sim \
    37. ${MINGW_PACKAGE_PREFIX}-tesseract-data-chi_tra

    下载 opencv4 源码并解压

    1. wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
    2. wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
    3. unzip opencv.zip
    4. unzip opencv_contrib.zip

     编写脚本 build-ocv.sh

    1. #!/bin/bash
    2. BUILD_DIR=${1:-build}
    3. export OpenBLAS_HOME=/mingw64
    4. export PATH=/mingw64/lib:/mingw64/bin:/mingw64/include:$PATH
    5. [ -e ${BUILD_DIR} ] && rm -r ${BUILD_DIR}/* || mkdir ${BUILD_DIR}
    6. cmake -B${BUILD_DIR} \
    7. -DOPENCV_EXTRA_MODULES_PATH=opencv_contrib-4.x/modules \
    8. -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_CXX_STANDARD=14 \
    9. -DWITH_OBSENSOR=OFF \
    10. -DWITH_OPENGL=ON \
    11. -DWITH_QT=OFF \
    12. -DWITH_GSTREAMER=ON \
    13. -DWITH_OPENCL=ON \
    14. -DOPENCV_ENABLE_NONFREE=ON \
    15. opencv-4.x
    16. # Build
    17. [ $? -eq 0 ] && cmake --build ${BUILD_DIR} -j 8

    由于网络速度慢,有几个文件下载超时,我通过迅雷下载好后 

    https://raw.githubusercontent.com/opencv/opencv_3rdparty/1224f78da6684df04397ac0f40c961ed37f79ccb/ippicv/ippicv_2021.8_lnx_intel64_20230330_general.tgz

    https://raw.githubusercontent.com/opencv/opencv_3rdparty/1224f78da6684df04397ac0f40c961ed37f79ccb/ippicv/ippicv_2021.8_win_intel64_20230330_general.zip

    https://github.com/opencv/ade/archive/v0.1.2b.zip

    https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat

     我通过迅雷下载后,复制到相应目录

    1. cp ippicv_2021.8_lnx_intel64_20230330_general.tgz opencv-4.x/3rdparty/ippicv/
    2. cp ippicv_2021.8_win_intel64_20230330_general.zip opencv-4.x/3rdparty/ippicv/
    3. cp  -f ade-0.1.2b.zip  opencv-4.x/.cache/ade/4f93a0844dfc463c617d83b09011819a-v0.1.2b.zip
    4. cp face_landmark_model.dat opencv-4.x/.cache/data/7505c44ca4eb54b4ab1e4777cb96ac05-face_landmark_model.dat

    二)错误修复:

    1.  在 msys2环境中执行 python 及 python2 失败。

    原因:msys2中的 python启动受到系统环境变量 PYTHONHOME 影响,这个环境变量一般是安装python windows 版本时被自动设置的。

    解决方法: 执行 unset  PYTHONHOME,如果不想每次启动msys都执行一次,可以写进 /etc/.bashrc 脚本中。

    2.  编译 obsensor 失败

    C:/workspace/libs/opencv/modules/videoio/src/cap_obsensor/obsensor_stream_channel_msmf.hpp:106:27: error: could not convert template argument 'cv::obsensor::ComPtr::__T_IID_getter' from 'const IID& (cv::obsensor::ComPtr::)()' {aka 'const GUID& (cv::obsensor::ComPtr::)()'} to 'const IID& (*)()' {aka 'const GUID& (*)()'}

      (参考 :Build with Ninja (MSYS2 UCRT64) on Windows 11 fails · Issue #23070   )

    原因: obsensor backend seems not to be supported on gcc.

    解决方案 :在cmake命令后增加 “ -DWITH_OBSENSOR=OFF ” 配置项

    3.  编译 homography.cc 出错

    编译 opencv_contrib-4.x/modules/sfm/src/libmv_light/libmv/multiview/homography.cc 是报错:

    mingw64/include/ceres/jet.h:834:10: error: 'j0' was not declared in this scope; did you mean 'V0'?

    参考  :j0 , j1, jn was not declared in this scope, …… · Issue #3013

    解决方案: cmake 配置参数增加  -DCMAKE_CXX_EXTENSIONS=ON 和 -DCMAKE_CXX_STANDARD=14

    4.  OPENBLAS 检测失败

    -- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off

     解决方案 :增加 OpenBLAS_HOME 定义

    export OpenBLAS_HOME=/mingw64

    5.  glog/gflags 组件检测失败

    (安装 mingw-w64-x86_64-cmake  而不是 cmake,以下是坚持使用 cmake的解决方法,我是杠精。)

    查看 CMakeFile/CMakeError.log 内容

    Run Build Command(s): /usr/bin/cmake.exe -E env VERBOSE=1 /usr/bin/make.exe -f Makefile cmTC_32ed8/fast
    /usr/bin/make  -f CMakeFiles/cmTC_32ed8.dir/build.make CMakeFiles/cmTC_32ed8.dir/build
    make[1]: Entering directory '/home/rd/opencv/build/CMakeFiles/CMakeTmp'
    Building CXX object CMakeFiles/cmTC_32ed8.dir/check_glog_gflags.cpp.o
    /mingw64/bin/c++.exe -DGFLAGS_IS_A_DLL=1 -DGLOG_CUSTOM_PREFIX_SUPPORT -DGLOG_NO_ABBREVIATED_SEVERITIES -isystem/mingw64/include -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden  -O3 -DNDEBUG  -DNDEBUG -std=c++11 -o CMakeFiles/cmTC_32ed8.dir/check_glog_gflags.cpp.o -c /home/rd/opencv/opencv_contrib-4.x/modules/sfm/cmake/checks/check_glog_gflags.cpp
    In file included from D:/msys64/mingw64/include/glog/logging.h:45,
                     from D:/msys64/home/rd/opencv/opencv_contrib-4.x/modules/sfm/cmake/checks/check_glog_gflags.cpp:1:
    D:/msys64/mingw64/include/c++/13.2.0/cstdlib:79:15: fatal error: stdlib.h: No such file or directory
       79 | #include_next
          |               ^~~~~~~~~~
    compilation terminated.
    make[1]: *** [CMakeFiles/cmTC_32ed8.dir/build.make:78: CMakeFiles/cmTC_32ed8.dir/check_glog_gflags.cpp.o] Error 1
    make[1]: Leaving directory '/home/rd/opencv/build/CMakeFiles/CMakeTmp'
    make: *** [Makefile:127: cmTC_32ed8/fast] Error 2

    , SFM_GLOG_GFLAGS_TEST FALSE

    解决方案 :

    增加编译宏定义 ENABLE_PRECOMPILED_HEADERS=OFF

     (参考C++编译时cstdlib中的#include_next <stdlib.h>报错、解决与思考_#include_next _彩虹能场的博客-CSDN博客)

    手动测试编译指令如下,发现没有解决

    /mingw64/bin/c++.exe -DENABLE_PRECOMPILED_HEADERS=OFF -DGFLAGS_IS_A_DLL=1 -DGLOG_CUSTOM_PREFIX_SUPPORT -DGLOG_NO_ABBREVIATED_SEVERITIES -isystem /mingw64/include -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden  -O3 -DNDEBUG  -DNDEBUG -std=c++11 -o CMakeFiles/cmTC_32ed8.dir/check_glog_gflags.cpp.o -c /home/rd/opencv/opencv_contrib-4.x/modules/sfm/cmake/checks/check_glog_gflags.cpp

    Use of -isystem - Development - CMake Discourse解决方案2 :

    删除 -isystem /mingw64/include  

    或改为 -isystem/mingw64/include (去除isystem后空格)

    或改为 -I /mingw64/include  (参考  Use of -isystem - Development - CMake Discourse )

    手动测试编译指令如下,可以生成

    /mingw64/bin/c++.exe -DGFLAGS_IS_A_DLL=1 -DGLOG_CUSTOM_PREFIX_SUPPORT -DGLOG_NO_ABBREVIATED_SEVERITIES -I /mingw64/include -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden  -O3 -DNDEBUG  -DNDEBUG -std=c++11 -o CMakeFiles/cmTC_32ed8.dir/check_glog_gflags.cpp.o -c /home/rd/opencv/opencv_contrib-4.x/modules/sfm/cmake/checks/check_glog_gflags.cpp

     修改 /opencv_contrib-4.x/modules/sfm/CMakeLists.txt 文件中 try_compile() 语句,增加    set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-I"), 不好使。

    1. if(NOT DEFINED SFM_GLOG_GFLAGS_TEST_CACHE_KEY OR NOT (SFM_GLOG_GFLAGS_TEST_CACHE_KEY STREQUAL __cache_key))
    2. set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-I")
    3. set(__fname "${CMAKE_CURRENT_LIST_DIR}/cmake/checks/check_glog_gflags.cpp")
    4. try_compile(
    5. SFM_GLOG_GFLAGS_TEST "${CMAKE_BINARY_DIR}" "${__fname}"
    6. CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${GLOG_INCLUDE_DIRS};${GFLAGS_INCLUDE_DIRS}"
    7. LINK_LIBRARIES ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES}
    8. OUTPUT_VARIABLE __output
    9. )
    10. if(NOT SFM_GLOG_GFLAGS_TEST)
    11. file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
    12. "Failed compilation check: ${__fname}\n"
    13. "${__output}\n\n"
    14. )
    15. endif()
    16. set(SFM_GLOG_GFLAGS_TEST "${SFM_GLOG_GFLAGS_TEST}" CACHE INTERNAL "")
    17. set(SFM_GLOG_GFLAGS_TEST_CACHE_KEY "${__cache_key}" CACHE INTERNAL "")
    18. message(STATUS "Checking SFM glog/gflags deps... ${SFM_GLOG_GFLAGS_TEST}")
    19. endif()

     修改 /usr/share/cmake/Modules/Compiler/GNU.cmake,注释掉 “ set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-isystem ") ” ,成功。

    6.   lapack 组件检测失败

    (安装 mingw-w64-x86_64-cmake  而不是 cmake,以下是坚持使用 cmake的解决方法,我是杠精。)

    Run Build Command(s): /usr/bin/cmake.exe -E env VERBOSE=1 /usr/bin/make.exe -f Makefile cmTC_dfa1f/fast
    /usr/bin/make  -f CMakeFiles/cmTC_dfa1f.dir/build.make CMakeFiles/cmTC_dfa1f.dir/build
    make[1]: Entering directory '/D/word/opencv/build/CMakeFiles/CMakeTmp'
    Building CXX object CMakeFiles/cmTC_dfa1f.dir/lapack_check.cpp.obj
    /mingw64/bin/CC.exe  -I/mingw64/include -I/D/tony/opencv/build -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden  -O3 -DNDEBUG  -DNDEBUG -std=c++11 -fPIE -o CMakeFiles/cmTC_dfa1f.dir/lapack_check.cpp.obj -c /D/work/opencv/opencv-4.x/cmake/checks/lapack_check.cpp
    In file included from D:/rd/opencv/opencv-4.x/cmake/checks/lapack_check.cpp:2:
    D:/work/opencv/build/opencv_lapack.h:11:10: fatal error: /mingw64/include/cblas.h: No such file or directory
       11 | #include "/mingw64/include/cblas.h"
          |          ^~~~~~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    make[1]: *** [CMakeFiles/cmTC_dfa1f.dir/build.make:78: CMakeFiles/cmTC_dfa1f.dir/lapack_check.cpp.obj] Error 1
    make[1]: Leaving directory '/D/rd/opencv/build/CMakeFiles/CMakeTmp'
    make: *** [Makefile:127: cmTC_dfa1f/fast] Error 2

    直接命令行执行编译指令可以复现这个错误。

    问题来源

          此天坑是由于 mingw的unix形式路径(/mingw64/include)都应该转化成windows形式使用(C:/msys2/ming64/include),一般 mingw会帮你自动完成,但是 gcc( g++、cc) 不是为 mingw 维护的,所以gcc可不会转换这个绝对路径。于是死球。

    参考:gcc/g++ cannot include file with absolute path · Issue #6711 · msys2/MINGW-packages · GitHub

          如果山不向你而来,你就应该向山撞去,

    修改 opencv-4.x/cmake/OpenCVFindLAPACK.cmake

    和 opencv-4.x/cmake/OpenCVFindLAPACK-DBG.cmake。

          删除 _find_header_file_in_dirs() 调用中的第三个参数  ${LAPACK_INCLUDE_DIR},这个参数会产生一个绝对路径,这个参数值正是 /mingw64/include

    1. macro(_find_header_file_in_dirs VAR NAME)
    2. unset(${VAR})
    3. unset(${VAR} CACHE)
    4. if(" ${ARGN}" STREQUAL " ")
    5. check_include_file("${NAME}" HAVE_${VAR})
    6. if(HAVE_${VAR})
    7. set(${VAR} "${NAME}") # fallback
    8. else()
    9. set(${VAR} "")
    10. endif()
    11. else()
    12. find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
    13. if(${VAR})
    14. set(${VAR} "${${VAR}}/${NAME}")
    15. unset(${VAR} CACHE)
    16. else()
    17. unset(${VAR} CACHE)
    18. set(${VAR} "")
    19. endif()
    20. endif()
    21. endmacro()
    22. macro(ocv_lapack_check)
    23. string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" _lapack_impl "${LAPACK_IMPL}")
    24. message(STATUS "LAPACK(${LAPACK_IMPL}): LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}")
    25. ## _find_header_file_in_dirs(OPENCV_CBLAS_H_PATH_${_lapack_impl} "${LAPACK_CBLAS_H}" "${LAPACK_INCLUDE_DIR}")
    26. _find_header_file_in_dirs(OPENCV_CBLAS_H_PATH_${_lapack_impl} "${LAPACK_CBLAS_H}" )
    27. ## _find_header_file_in_dirs(OPENCV_LAPACKE_H_PATH_${_lapack_impl} "${LAPACK_LAPACKE_H}" "${LAPACK_INCLUDE_DIR}")
    28. _find_header_file_in_dirs(OPENCV_LAPACKE_H_PATH_${_lapack_impl} "${LAPACK_LAPACKE_H}")

     之后,链接 lapack_check.obj 报错无数

    D:/msys64/mingw64/lib/libopenblas.a(sgemm_direct_performant_BULLDOZER.c.obj):(.text+0x41): undefined reference to `omp_get_max_threads'

    手动执行编译指令调试

    1. echo " lapack_check.cpp --> lapack_check.obj "
    2. /mingw64/bin/CC.exe -I/mingw64/include -I/D/tony/opencv/build -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG -std=c++11 -fPIE \
    3. -o lapack_check.cpp.obj \
    4. -c opencv-4.x/cmake/checks/lapack_check.cpp
    5. echo " lapack_check.obj --> lapack_check.out "
    6. /mingw64/bin/CC.exe -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG -Wl,--gc-sections \
    7. lapack_check.cpp.obj \
    8. -o lapack_check.out \
    9. /mingw64/lib/libopenblas.a

    发现还需要追加静态库

    •  /mingw64/lib/libgomp.a
    • /mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/libgfortran.a
    • /mingw64/lib/libquadmath.a

     手动编译成功

    1. /mingw64/bin/CC.exe -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG -Wl,--gc-sections \
    2. lapack_check.cpp.obj \
    3. -o lapack_check.out \
    4. /mingw64/lib/libopenblas.a \
    5. /mingw64/lib/libgomp.a \
    6. /mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/libgfortran.a \
    7. /mingw64/lib/libquadmath.a

    ,修改 opencv-4.x/cmake/OpenCVFindLAPACK.cmake

    和 opencv-4.x/cmake/OpenCVFindLAPACK-DBG.cmake 如下:

    1. - set(LAPACK_LIBRARIES ${OpenBLAS_LIB}
    2. + set(LAPACK_LIBRARIES ${OpenBLAS_LIB}
    3. + /mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/libgfortran.a
    4. + /mingw64/lib/libquadmath.a
    5. + /mingw64/lib/libgomp.a
    6. + )

    因为没有检查 libgomp等库是否存在,不算是一个完整的补丁,但效果不减。

    (哎,干怎么多都不如安装正确的cmake版本,我真傻。)

    7.  工作目录名的坑

    工作目录名不要用 opencv2,否则编译 opencv-4.x/modules/gapi/misc/python/python_bridge.hpp
    会报错。

    祝好运。

  • 相关阅读:
    华为机试真题 Java 实现【运维日志排序】
    JUC并发编程——CAS与原子引用(基于狂神说的学习笔记)
    linux安装Jdk
    el-table实现表格整行选中状态,背景颜色切换
    SpringCloud Alibaba——精读Nacos+CMDB+核心源码阅读(7w字长篇)
    基于单片机的胎压监测系统的设计
    Python 深度学习导入的一些包的说明
    Java~List接口详解
    【C++】STL案例2-员工分组
    Java“白皮书”的关键术语
  • 原文地址:https://blog.csdn.net/Tonyfield/article/details/133406390