Ubuntu 18.04 OpenCV 4.5 ROS Melodic 共存方案
用过Ubuntu 18.04做视觉开发的朋友估计都经历过头疼时刻系统里跑着ROS Melodic自带OpenCV 3.2结果为了用新算法手痒编译了个OpenCV 4.5编译器立刻给你上演“头文件找不到”“库版本冲突”“ROS节点莫名崩溃”的连续剧。这问题几乎每个搞机器人、无人车、视觉SLAM的开发者都撞上过区别只是踩坑深浅。我花了不少时间把C和Python两套环境的搭建方式、以及和ROS和平共处的方案彻底摸了一遍今天把能直接照着抄的完整过程整理出来希望能帮你少走些弯路。这篇文章涵盖的内容包括Ubuntu 18.04下OpenCV源码编译的完整步骤C方向、Python环境的两种推荐搭配方式pip与conda、以及四种实测有效的OpenCV与ROS冲突解决方案。无论你是刚开始搭环境的新手还是已经被编译错误折磨到抓狂的进阶玩家这篇文章里的命令、参数和排查思路都能直接拿来用。1. 为什么Ubuntu 18.04上的OpenCV总和ROS打架冲突根源与方案选型1.1 冲突根源一套系统里存在两套OpenCV在动手之前先搞清楚问题本质。Ubuntu 18.04搭配的ROS Melodic发行版骨子里依赖的是OpenCV 3.2.0。这个版本不光被ROS核心模块使用还被大量ROS生态包依赖特别是图像处理里最常用的cv_bridge功能包它专门负责在ROS的图像消息sensor_msgs/Image和OpenCV的Mat对象之间做转换。问题来了当你为了使用新版算法手动从源码编译安装了OpenCV 4.x之后系统里就同时存在了两套OpenCV一套是apt安装的OpenCV 3.2头文件在/usr/include/opencv和/usr/include/opencv2库文件在/usr/lib/x86_64-linux-gnu/。另一套是源码编译的OpenCV 4.x头文件在/usr/local/include/opencv4库文件在/usr/local/lib。两套库同时存在本身没有致命问题致命的是它们的头文件和动态库名称高度重叠。几乎所有源码编译的OpenCV 4.x都会生成libopencv_core.so这样的文件而apt版OpenCV 3.2同样也生成libopencv_core.so。你的工程一旦同时把/usr/include和/usr/local/include都加入到搜索路径编译器就会随机抽取头文件版本而链接器也不知道该优先链接哪个库文件。轻则编译报错重则程序运行时加载到不匹配的动态库版本直接崩溃连错误信息都来不及给。1.2 方案选型三条路线怎么选搞清楚冲突原因之后我们再谈方案。针对不同的使用场景我整理了三套思路你可以根据自己的实际需求选方案A纯apt安装一条命令搞定。对所有要求不高的开发场景尤其是以ROS开发为主、OpenCV只是辅助的场景直接sudo apt install libopencv-dev。这套方法装的OpenCV 3.2和ROS完全同源不会有版本摩擦。缺点是版本太老很多新算法如部分DNN模块、新的特征检测算子用不了。方案B源码编译OpenCV 4.x走/usr/local前缀主打C开发。这条路适合那些需要新版OpenCV接口的C项目比如自己写视觉算法、想用SIFT新实现、跑YOLO的DNN推断等。这条路的难点就是和ROS共存需要额外的头文件路径和链接管理。本文第2节和第4节重点讲这条路线。方案CPython环境走conda或pip虚拟环境隔离主打Python开发。Python方向我强烈建议把OpenCV装进独立环境里不要直接装在系统Python里。因为Ubuntu 18.04系统自带的Python 3.6被ROS深度绑定你一旦用pip强制升级或降级某些包很容易把系统python的依赖关系搞坏严重时ROS节点启动都困难。第3节会详细说明具体操作。我的实际建议是组合拳C项目走源码编译的4.xPython项目走conda虚拟环境ROS项目保持apt的3.2不动。三者通过路径隔离和环境变量隔离互不干扰。这套组合我用了很长时间稳定可靠。2. C环境搭建源码编译OpenCV 4.x完整流程2.1 安装前的依赖准备一个都不能少源码编译OpenCV最痛苦的部分不是编译本身而是编译前的依赖准备。依赖没装齐编译到一半报错又得从头再来非常搞心态。我在Ubuntu 18.04上反复折腾过几次之后总结出了下面这套依赖安装命令基本覆盖全部需求sudo apt update sudo apt install -y build-essential cmake git pkg-config sudo apt install -y libjpeg8-dev libtiff5-dev libpng-dev sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt install -y libxvidcore-dev libx264-dev sudo apt install -y libgtk-3-dev sudo apt install -y libatlas-base-dev gfortran sudo apt install -y python3-dev python3-numpy逐行解释一下关键包的作用build-essential提供gcc、g等基础编译器cmake是OpenCV用的构建工具libgtk-3-dev负责提供GUI窗口支持少了它即使编译成功cv::imshow也无法显示窗口libavcodec-dev等一组库是视频编解码的核心依赖少了它们VideoCapture读取视频文件会失败python3-dev和python3-numpy则是编译Python绑定时必需的。这里特别提醒一句libjpeg8-dev这个包名在Ubuntu 18.04里存在但实际系统可能已经通过libjpeg-turbo8-dev提供相同功能如果你在安装时提示找不到包就换成libjpeg-turbo8-dev不影响OpenCV编译。这种依赖命名差异在18.04上很常见不用慌。2.2 下载源码与CMake配置参数就是命运依赖准备好之后接下来是获取源码。用git方式拉取比较省事还能方便切换版本cd ~ git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git cd opencv git checkout 4.5.5 cd ../opencv_contrib git checkout 4.5.5这里选择4.5.5版本是出于稳定性考虑4.x系列中这个版本比较成熟且和Ubuntu 18.04默认的GCC 7.5.0兼容良好。主仓库和contrib扩展模块仓库必须切到同一个版本标签否则编译时会出现模块接口对不上的问题。源码就位后创建build目录并运行cmakecd ~/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH~/opencv_contrib/modules \ -D WITH_TBBON \ -D WITH_OPENMPON \ -D WITH_GTKON \ -D BUILD_opencv_python3ON \ -D PYTHON3_EXECUTABLE$(which python3) \ -D BUILD_EXAMPLESOFF \ -D INSTALL_PYTHON_EXAMPLESOFF \ -D BUILD_TESTSOFF \ ..几个关键参数解读一下。CMAKE_INSTALL_PREFIX/usr/local是源码编译软件的标准安装位置跟前述的apt版OpenCV安装到/usr区分开这是解决冲突的第一步。OPENCV_EXTRA_MODULES_PATH指向contrib仓库的模块目录想要SIFT、SURF这些经典特征算法就必须指定否则OpenCV 4.x主仓库里默认不带它们。WITH_TBB和WITH_OPENMP是并行计算支持对图像处理性能有明显提升建议打开。BUILD_opencv_python3ON这个参数很多人容易忽略。不加的话编译产物里就没有Python3的绑定模块。但注意即便开了这个开关由于系统里同时存在Python 3.6系统和可能的conda Python如3.9/3.10cmake也可能选择了错误的Python版本。保险的做法是显式指定PYTHON3_EXECUTABLE告诉cmake你到底想给哪个Python版本生成绑定。2.3 编译、安装与C验证亲眼看到结果才放心cmake配置完毕没有报错的话接下来就是见证CPU风扇狂转的时刻make -j$(nproc) sudo make install sudo ldconfigmake -j$(nproc)会调用所有CPU核心参与编译速度可以快好几倍。但有个特殊情况如果机器内存只有8G十几核同时编译很容易把内存耗尽导致OOM进程直接被杀。我建议内存紧张的同学用make -j4慢一点但至少不会中途挂掉。编译过程通常会持续15到30分钟出去泡杯茶正好。安装完成后老规矩写个最简单的C程序验证环境是否可用。我习惯建一个test_opencv.cpp#include opencv2/opencv.hpp #include iostream int main() { cv::Mat img cv::Mat::zeros(300, 300, CV_8UC3); cv::putText(img, OpenCV OK, cv::Point(50, 150), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(0, 255, 0), 2); cv::imwrite(test_result.jpg, img); std::cout OpenCV version: CV_VERSION std::endl; return 0; }编译命令g test_opencv.cpp -o test_opencv pkg-config --cflags --libs opencv4 ./test_opencv如果屏幕上打印出OpenCV 4.5.5并且当前目录生成了test_result.jpg说明C环境已经可用。这里有个分水岭打印的版本号如果是4.5.5说明链接的是源码编译的新版如果打印3.2.0说明pkg-config还在指向apt版OpenCV路径需要检查PKG_CONFIG_PATH环境变量。这个问题我们会在第4节的冲突解决方案里详细处理。3. Python环境用对隔离别让ROS陪你一起翻车3.1 系统pip安装的隐患你能装但我不推荐Python调用OpenCV最方便的方式当然是pip install opencv-python一条命令就完成了。如果你只是在本机做一些独立的图像处理实验跟ROS没有半毛钱关系那这么装完全没问题省心省力。但问题就出在“系统pip”这三个字上。Ubuntu 18.04的pip3 install默认装到/usr/lib/python3/dist-packages这个目录是ROS Python依赖的驻地。执行pip3 install opencv-python时pip会顺手检查依赖可能触发numpy等核心库的升级。一旦numpy从系统要求的版本被升到另一个版本ROS底层很多依赖numpy的功能包直接罢工。我见过最惨的一次仅仅装了个opencv-python同事的roslaunch就再也起不来了报错全是numpy ABI不匹配。所以我的建议简单粗暴不乱动系统环境给Python开发单独开一间“房”。3.2 conda虚拟环境Python开发的首选归宿我用的Python环境隔离工具是Miniconda比Anaconda轻量装起来也快。下载安装脚本后直接执行wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装完成后创建一个独立的虚拟环境conda create -n cv4 python3.8 -y conda activate cv4注意这里选Python 3.8而不是系统默认的3.6目的就是彻底避开系统Python的干扰。接下来在这个环境里安装OpenCVconda install opencv -c conda-forge -y或者用pip安装两种方式任选其一pip install opencv-python opencv-contrib-python装完之后验证一下版本python -c import cv2; print(cv2.__version__)正常情况下会打印4.x版本号。这里有个非常关键的小验证步骤检查cv2模块实际导入路径。python -c import cv2; print(cv2.__file__)拿到这个路径后确认它位于conda环境目录下而不是/usr/lib/python3/dist-packages。如果输出路径仍然指向系统目录说明conda环境没有彻底隔离需要检查PYTHONPATH环境变量里是不是有人手动加了系统路径。3.3 Python与ROS共存时的额外注意事项即使你用了conda虚拟环境和ROS共存时还会遇到一个意想不到的问题import cv2倒是正常但如果某个程序同时导入了ROS的cv_bridge两边会打起来。原因是cv_bridge是ROS里用系统Python编译的它内部链接的系统OpenCV 3.2而你在conda环境里用的是OpenCV 4.x。Python本身的cv2模块和cv_bridge的C底层库同时存在时由于它们引用的OpenCV符号版本不一致程序跑起来就会时不时崩溃。规避的方法是不要在同一个Python进程里混用conda环境中的cv2和ROS的cv_bridge。凡是涉及ROS消息和图像转换的功能应该写成独立的ROS节点用系统Python执行而纯算法部分走conda环境。如果你确实需要在一个脚本里同时使用ROS和OpenCV的新版本接口那就要考虑下一种兼容方案把ROS的cv_bridge也换成OpenCV 4.x重新编译。这个方法操作比较重但对某些特定项目确实是最优解我会在第4节给出思路。4. OpenCV与ROS冲突的终极解决方案四招实测可用4.1 冲突现象速查先判断你的问题属于哪一类我在整理解决方案之前先把常见的冲突现象列出来方便你对号入座现象触发场景根因编译时报错找不到opencv2/opencv.hpp自己的C工程头文件路径没包含OpenCV 4.x目录编译时报错函数在cv::命名空间中未定义自己的C工程头文件用的是3.2但链接的是4.x或反之编译ROS功能包时突然报OpenCV相关错误ROS catkin_makeROS默认的3.2路径和自定义4.x路径冲突程序编译通过但运行时崩溃提示libopencv_core.so.3.2找不到运行自己的程序程序链接时指向了3.2库但3.2库文件被4.x覆盖Python里import cv2后调用图像显示秒退Python环境Python加载了错误版本的cv2.soROS节点启动后图像话题回传全是黑屏ROSrvizcv_bridge链接的OpenCV版本与其他组件不一致对号入座之后下面四招按需使用。4.2 策略一头文件与库的路径分离管理核心思路让系统同时存在两套OpenCV但通过路径优先级让不同的工程各取所需。源码编译的OpenCV 4.x默认装在/usr/localapt版OpenCV 3.2装在/usr。这两个目录在C/C编译器的默认搜索路径里是有先后顺序的/usr/local/include优先于/usr/include/usr/local/lib优先于/usr/lib。也就是说如果你只是普通编译一个不带ROS的独立C程序编译器天然会优先找到/usr/local里的OpenCV 4.x这其实是安全的。问题大多出在ROS的catkin编译环境。catkin会显式添加大量-I/opt/ros/melodic/include这样的参数到编译命令里而ROS的include目录恰好包含OpenCV 3.2的头文件路径。最终编译命令里/usr/local/include/opencv4和/opt/ros/melodic/include/opencv-3.2.0都会被搜索头文件版本之战就此爆发。解决思路是在编译ROS功能包时不要模糊搜索头文件而是让cmake显式地只找其中一个版本。在你自己的CMakeLists.txt里指定OpenCV的路径set(OpenCV_DIR /usr/local/lib/cmake/opencv4) find_package(OpenCV 4 REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(your_target ${OpenCV_LIBS})OpenCV_DIR指向源码编译安装时生成的cmake配置文件目录find_package就能精准找到OpenCV 4.x的配置。这样即使系统里还躺着3.2你的工程也不会混淆。4.3 策略二CMake工程显式指定OpenCV版本这条策略是针对自己的C工程而非ROS功能包。很多人在自己的项目里写find_package(OpenCV REQUIRED)这样cmake会按照默认路径搜索在同时存在两套库的时候找到哪个全看搜索顺序的运气。更好的写法是主动指定版本和路径把不确定性排除set(OpenCV_DIR /usr/local/lib/cmake/opencv4) find_package(OpenCV 4.5 REQUIRED) message(STATUS OpenCV_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS}) message(STATUS OpenCV_LIBS ${OpenCV_LIBS})find_package(OpenCV 4.5 REQUIRED)会强制要求找到4.5这个版本如果搜到3.2cmake会直接报错而不是偷偷用错误版本继续往下走。message语句用于打印实际找到的路径和库方便你确认cmake到底选中了哪套OpenCV。建议每次配置完编译前都看一眼这两行输出信息能省下大量排查时间。4.4 策略三ROS端的cv_bridge版本对齐如果你的项目必须同时用到ROS的消息系统和新版OpenCV比如你在写一个订阅图像话题又要用DNN模块做推理前面两个策略就不够了问题出在ROS的cv_bridge还没跟新版OpenCV对齐。标准的cv_bridge依赖系统OpenCV 3.2。如果要让ROS生态整体拥抱OpenCV 4.x就需要重新编译cv_bridge。流程不复杂但要注意细节。先找到cv_bridge的源码在ROS官方仓库可以拉取对应melodic分支然后修改它的CMakeLists.txtset(OpenCV_DIR /usr/local/lib/cmake/opencv4) find_package(OpenCV 4 REQUIRED)然后重新编译整个工作空间。这个过程相当于把ROS的视觉依赖基础从3.2升级到4.x。缺点是可能有一批旧版本的功能包接口不兼容需要你逐个排查。优点是只要编译通过整个ROSN生态就统一在OpenCV 4.x下了后续开发再也不用关心版本错位问题。这条路只建议对ROS生态控制力比较强、功能包数量有限的开发者尝试。如果工作空间里有大量第三方ROS包我不建议升级cv_bridge风险太大。我就是在这上面吃了大亏之后才转向了第4.5节的方案。4.5 策略四物理隔离互不相干这是我个人最终采用的方案也是我认为最稳妥的方案让ROS系统的OpenCV和自定义OpenCV彻底物理隔离互不干涉。具体操作分三层第一层ROS系统包保持apt版OpenCV 3.2不动不卸载、不升级、不覆盖。确保/opt/ros/melodic路径下的所有库都保持原样。第二层自定义C算法程序的CMakeLists.txt里强制只找OpenCV 4.xset(OpenCV_DIR /usr/local/lib/cmake/opencv4) find_package(OpenCV 4 REQUIRED)禁止把/opt/ros/melodic/include加入到自定义算法的include path里。第三层Python端统一走conda虚拟环境路径由PYTHONPATH严格指定。在~/.bashrc里加一行# 仅在需要时激活conda环境不要全局设置PYTHONPATH conda activate cv4同时不要设置全局PYTHONPATH/usr/local/lib/python3.6/site-packages否则又会把源码编译时期生成的cv2.so引入系统Python环境造成混乱。如果你发现系统Python和conda环境的OpenCV发生了交叉用type -a python python -c import sys; print(sys.path)检查启动顺序确认当前shell里用的是哪个python再对症调整~/.bashrc。这套三层隔离方案执行下来我这边的开发环境和ROS环境已经稳定共处了很长时间基本没有再出现莫名其妙的版本打架问题。5. 常见问题与排查技巧实录5.1 高频报错排查速查表把上面所有方案归结完后我整理了实际运行中最常遇到的报错和对应解法做成一张速查表方便你直接检索。报错或现象可能原因解决动作fatal error: opencv2/opencv.hpp: No such file or directory编译命令里没加OpenCV头文件路径用pkg-config或cmake的include_directories显式指定undefined reference to cv::imread(...)有头文件但没链接库检查target_link_libraries是否包含了${OpenCV_LIBS}libopencv_core.so.3.2: cannot open shared object file程序链接了3.2库但系统里该库不可见检查ldd输出sudo ldconfig刷新缓存或用LD_LIBRARY_PATH指定路径OpenCV(4.x) ... error: Assertion failed程序运行的是4.x库但接口使用习惯仍是3.x检查代码里是否使用了已废弃API按新接口改写ROS节点启动时崩溃报cv::Mat相关错误cv_bridge与程序链接的OpenCV版本不匹配统一版本或按第4.4节重新编译cv_bridgepython3 import cv2 ImportError: No module named cv2Python路径里没有cv2模块在conda环境里执行pip install opencv-pythonimport cv2; cv2.__version__显示3.2而不是4.ximport混乱导入了系统路径的cv2检查cv2.__file__路径调整PYTHONPATH或虚拟环境5.2 三个排查命令救命的“三板斧”遇到OpenCV相关疑难杂症时我习惯先跑三个命令确认当前系统状态再决定怎么动手# 看当前系统能找到哪些OpenCV版本 pkg-config --modversion opencv pkg-config --modversion opencv4 # 看实际库文件版本 ls -l /usr/local/lib/libopencv_core.so* ls -l /usr/lib/x86_64-linux-gnu/libopencv_core.so* # 看程序实际加载了哪个库 ldd your_program | grep opencv第一条命令确认pkg-config是否找到了多个版本第二条命令确认两套库是否共存第三条命令直接定位程序链接的库文件和路径。绝大部分冲突问题靠这三条命令就能排查出七八分。5.3 意外的“元凶”GCC版本与C标准还有一个容易被忽略的坑和OpenCV与ROS的冲突无关但和Ubuntu 18.04的环境强相关编译OpenCV 4.5.x需要编译器支持C11标准Ubuntu 18.04默认的GCC 7.5完全没问题。可如果你用conda环境执行gconda可能会把编译器切换到新版GCC比如10.x这时候某些老ROS包的编译反而可能因为新编译器太严格而失败。解决办法是在需要编译ROS功能包时显式指定编译器版本export CC/usr/bin/gcc export CXX/usr/bin/g这两个环境变量告诉cmake使用系统默认的GCC 7.5而不是conda环境里的新版GCC。这个小细节能避免很多“莫名其妙就编译失败”的问题。5.4 我踩过的一个最隐蔽的坑环境变量残留最后讲一个我亲身经历过的隐蔽问题。某次我在/etc/ld.so.conf.d/里创建了一个自定义conf文件内容指向/usr/local/lib本意是想让自定义库生效结果这个文件让系统里所有程序在启动时都优先加载了/usr/local/lib下的libopencv_core.so.4.5。ROS节点启动时加载cv_bridge的3.2库但cv_bridge依赖的libopencv_core.so被劫持成了4.5版本结果惨不忍睹。排查这个问题的过程相当痛苦ldd查出来的是3.2库存在但程序一跑就崩。后来才发现是/etc/ld.so.conf.d/下的加载顺序在作怪。从此之后我给自己立了条规矩不轻易改全局ld配置自定义库路径一律放在用户级LD_LIBRARY_PATH里并严格做到按项目单独设置不在~/.bashrc里写死全局路径。排查这个问题的过程相当痛苦ldd查出来的是3.2库存在但程序一跑就崩。后来才发现是/etc/ld.so.conf.d/下的加载顺序在作怪。从此之后我给自己立了条规矩不轻易改全局ld配置自定义库路径一律放在用户级LD_LIBRARY_PATH里并严格做到按项目单独设置不在~/.bashrc里写死全局路径。6. 实操心得补充两个高效小工具6.1 版本切换神器update-alternatives如果你需要在系统中频繁切换OpenCV版本比如有时编译ROS插件有时做纯算法实验可以考虑使用update-alternatives管理头文件和CMake配置。这个工具本来是管理默认命令版本的但同样适用于管理OpenCV的cmake配置链接。思路是把/usr/local/lib/cmake/opencv4和/usr/lib/x86_64-linux-gnu/cmake/opencv3分别注册为alternatives然后随时切换默认OpenCV_DIR的指向。不过这个方案操作复杂度偏高且对CMake工程的支持并不完美实际运维成本比较大。我自己试过一段时间后放弃了这个做法最终还是回到了第4.5节的物理隔离方案。如果你不是有极高的切换频率需求不建议在这个方向上投入过多时间。6.2 Docker方案一劳永逸的终极隔离如果你愿意尝试容器化开发Docker可能是解决OpenCV和ROS冲突的最干净方式在镜像里分别构建ROS环境和OpenCV 4环境运行多个容器互相隔离。但Docker方案也有一个让人头疼的问题GUI显示和摄像头直通。你需要额外配置X11转发把宿主机的显示接口挂给容器和/dev/video0设备映射一度让我觉得配置时间比写代码时间还长。如果你的项目里不涉及实时视频流和GUI预览纯算法开发用Docker很省心一旦需要跑摄像头和显示窗口还是老老实实本地装吧。从个人经验来看做长期维护的机器人项目本地物理隔离方案总是最可控的选择。后期如果项目迭代方向和团队协作方式变化可以从容器化逐步过渡把环境配置固化成Dockerfile或Ansible脚本那其实是另一个值得深入的话题了。我个人在实际操作中的体会是环境搭建没有一劳永逸的银弹但把“路径隔离、版本显式化、环境变量最小化”这三个原则执行到位至少能解决掉八成以上的OpenCV和ROS冲突问题剩下的该翻文档翻文档该看源码看源码事情总会做得下去的。

相关新闻

论文写作辅助工具实测:从选题到答辩的九类工具选型指南

论文写作辅助工具实测:从选题到答辩的九类工具选型指南

每年本科生开始动论文的时候,我都会被问一个问题:“有没有那种能一键生成论文的工具?”2026届的学弟学妹也不例外,而且问得比往年更直接。我在各个学术交流群里见过不少同学,把“一键生成论文工具”当成救命稻草&#…

2026/10/15 5:58:39 阅读更多 →
MyBatis Generator进阶:generatorConfig.xml一键生成Service和Controller

MyBatis Generator进阶:generatorConfig.xml一键生成Service和Controller

前阵子帮一个团队落地 MyBatis 代码生成链路,发现一个非常普遍的情况:generatorConfig.xml只生成了 Model 和 Mapper,Service、ServiceImpl、Controller 还是靠人肉复制粘贴。表一多,一个模块十几张表,每张表都要手写一…

2026/10/15 5:58:39 阅读更多 →
软考 系统架构设计师历年真题集萃(65)

软考 系统架构设计师历年真题集萃(65)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(64) 第105题 “4+1”视图主要用于描述系统逻辑架构,最早由Philippe Kruchten于1995年提出。其中()视图用于描述对象模型,并说明系统应该为用户提供哪些服务。当采用面向对象的设计方法描述对象模型时,通常使用(…

2026/10/15 5:58:39 阅读更多 →

最新新闻

从画图到设计:用文本化DSL把架构图变成可维护的工程资产

从画图到设计:用文本化DSL把架构图变成可维护的工程资产

平时我见得最多的“图”,不是最终文档里那张漂亮的架构图,而是评审会上被临时画在白板上的方框加箭头。主讲人一边画一边改,台下的人一边看一边猜。等会议结束,没人记得箭头谁指向谁,只记得“好像讲了一个方案”。后来…

2026/10/15 8:25:33 阅读更多 →
t3code赛事编码协议:从计时数据到成绩榜单的自动化方案

t3code赛事编码协议:从计时数据到成绩榜单的自动化方案

如果你跟我一样,经常被各种赛事计时表、Excel 成绩单、手动排名搞到半夜,那你一定要试试 t3code 这套思路。t3code 最开始只是我给一个周末赛车活动写的三行脚本,后来慢慢变成了一套三段式赛事编码协议:练习、排位、正赛三段&…

2026/10/15 8:25:33 阅读更多 →
SylixOS应用开发指南:线程模型、同步机制与调试实践

SylixOS应用开发指南:线程模型、同步机制与调试实践

简介:《SylixOS应用开发手册1》是一份面向具备C语言基础的程序员的实时嵌入式操作系统开发指南,系统讲解SylixOS应用程序设计接口,适用于航空航天、工业自动化、通信、新能源等场景。压缩包内共1个pdf文件,大小14.95MB&#xff0c…

2026/10/15 8:25:33 阅读更多 →
多协议网络库的架构设计与核心实现:从Reactor线程模型到协议解析

多协议网络库的架构设计与核心实现:从Reactor线程模型到协议解析

1. 为什么需要多协议网络库大概两年前,我们团队接手了一个典型的“什么都要接”的后台系统:对外要提供HTTP接口,方便前端和第三方系统调用;要和一批长期在线的硬件设备保持TCP长连接,并且随时可能下发指令;…

2026/10/15 8:25:33 阅读更多 →
T3 Stack全栈实战:构建类型安全的代码片段管理应用

T3 Stack全栈实战:构建类型安全的代码片段管理应用

如果你正在找一份能直接上手、不用绕弯子的全栈项目教程,那么基于 T3 Stack 打造的t3code应该能对上你的胃口。这个项目本质上是一个代码片段分享与管理系统,开发者可以注册登录,把自己常用的代码块按语言分类保存,支持标签检索、…

2026/10/15 8:25:33 阅读更多 →
多模态AI视频搜索实战:从250分钟到2分钟的工程化落地

多模态AI视频搜索实战:从250分钟到2分钟的工程化落地

1. 项目背景与核心痛点拆解1.1 250分钟到底卡在哪里视频搜索这件事,没做过的人会觉得不就是搜个关键词吗。但真正处理过大规模视频素材库的从业者都清楚,传统视频检索的流程有多笨重。Cond Nast 作为一家拥有海量视频内容的媒体集团,旗下品牌…

2026/10/15 8:24:32 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →