当前位置: 首页 > news >正文

C++项目指定依赖路径

1. 背景

A、B 两个项目都依赖fmt,但是A依赖fmt8, B依赖fmt9。
系统中存在两个版本的fmt:

  • apt安装的fmt8 .h头文件在/usr/include/fmt/下, .so库文件在./lib/x86_64-linux-gnu/libfmt.so.8
  • 还有一个源码编译的fmt,源码在/3rdparty/fmt/下,头文件在/3rdparty/fmt/include/下, 库文件在~/3rdparty/fmt/build/下。 并且执行sudo make install进行安装, 头文件和库文件分别安装在了/usr/local/include/fmt/下和/usr/local/lib/libfmt.so.9.1。

编译时会优先选择/usr/local/下的依赖。A是长期维护的项目,B是临时项目,所以我将/usr/local/下的fmt相关依赖都删除了,保证编译A时能成功链接到fmt8版本。
现在需要解决B的依赖问题:编译B时不会自动找到fmt9的路径,会报错找不到fmt9的错误,编译失败。需要手动指定其依赖路径为源码编译的头文件和库文件路径。

2. 实施

B项目的CMakeLists.txt添加如下内容:

# 定义变量 THIRD_PARTY_ROOT,保存第三方库根目录,便于后续引用
set(THIRD_PARTY_ROOT "/home/koap/3rdparty")
# 定义变量 SPDLOG_SO和FMT_SO,为 spdlog和fmt共享库的绝对路径字符串
set(SPDLOG_SO "${THIRD_PARTY_ROOT}/spdlog/build/libspdlog.so.1.11.0")
set(FMT_SO    "${THIRD_PARTY_ROOT}/fmt/build/libfmt.so.9.1.0")# 把这两个目录加入编译器的头文件搜索路径(-I),编译时能找到 spdlog/fmt 的头文件。
include_directories("${THIRD_PARTY_ROOT}/spdlog/include""${THIRD_PARTY_ROOT}/fmt/include"
)# 向 linker 添加搜索目录(-L),使得在使用未写绝对路径的库名时 linker 能在这些目录查找共享/静态库。注意:使用绝对库路径时不必依赖此项,但保留不会有害。
link_directories("${THIRD_PARTY_ROOT}/spdlog/build""${THIRD_PARTY_ROOT}/fmt/build"
)add_executable(g2oCurveFitting g2oCurveFitting.cpp)
# 为目标设置链接库
target_link_libraries(g2oCurveFitting${OpenCV_LIBS}${G2O_CORE_LIBRARY}${G2O_STUFF_LIBRARY}${FMT_SO}      # link fmt (use full path)${SPDLOG_SO}   # link spdlog (use full path)
)# 设置目标的 rpath(运行时库搜索路径)属性,避免运行时出现 “找不到 libfmt.so/libspdlog.so” 的错误,而无需每次手动设置 LD_LIBRARY_PATH
set_target_properties(g2oCurveFitting PROPERTIESBUILD_RPATH "${THIRD_PARTY_ROOT}/spdlog/build;${THIRD_PARTY_ROOT}/fmt/build"INSTALL_RPATH "${THIRD_PARTY_ROOT}/spdlog/build;${THIRD_PARTY_ROOT}/fmt/build"BUILD_WITH_INSTALL_RPATH TRUE
)

编译成功。

3. 问题和排查方法

运行时报错:
./g2oCurveFitting: error while loading shared libraries: libspdlog.so.1.11: cannot open shared object file: No such file or directory
排查1:查看g2oCurveFitting的依赖

koap@koap:~/workspace/slambook2/ch6/build$ ldd g2oCurveFitting linux-vdso.so.1 (0x00007fff305be000)libg2o_core.so.0.1 => /usr/local/lib/libg2o_core.so.0.1 (0x0000759b674ae000)libg2o_stuff.so.0.1 => /usr/local/lib/libg2o_stuff.so.0.1 (0x0000759b67463000)libopencv_core.so.411 => /usr/local/lib/libopencv_core.so.411 (0x0000759b66600000)libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000759b66200000)libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x0000759b66519000)libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000759b67441000)libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x0000759b65e00000)libspdlog.so.1.11 => not foundlibfmt.so.9 => not foundlibspdlog.so.1.11 => not foundlibfmt.so.9 => not foundlibz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x0000759b673ef000)/lib64/ld-linux-x86-64.so.2 (0x0000759b675d5000)

libspdlog.so.1.11libfmt.so.9都未被找到,说明是依赖的路径问题。
但明显与

set_target_properties(g2oCurveFitting PROPERTIESBUILD_RPATH "${THIRD_PARTY_ROOT}/spdlog/build;${THIRD_PARTY_ROOT}/fmt/build"INSTALL_RPATH "${THIRD_PARTY_ROOT}/spdlog/build;${THIRD_PARTY_ROOT}/fmt/build"BUILD_WITH_INSTALL_RPATH TRUE
)

的设定矛盾。

排查2:是否路径失效或者错误
指定LD路径执行:

LD_LIBRARY_PATH=/home/koap/3rdparty/spdlog/build:/home/koap/3rdparty/fmt/build ./g2oCurveFitting

程序可以正常运行,说明路径本身没有问题。
当然,此方法也可以临时解决该问题,但是不够方便,而且时间久了也记不住。

排查3:打开动态链接调试,查看 loader 在哪里查找这些库

koap@koap:~/workspace/slambook2/ch6/build$ LD_DEBUG=libs ./g2oCurveFitting 2>&1 | grep -E "spdlog|fmt|search path"53197:	 search path=/usr/lib/glibc-hwcaps/x86-64-v3:/usr/lib/glibc-hwcaps/x86-64-v2:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:/usr/lib		(system search path)53197:	 search path=/usr/local/lib/glibc-hwcaps/x86-64-v3:/usr/local/lib/glibc-hwcaps/x86-64-v2:/usr/local/lib/tls/haswell/x86_64:/usr/local/lib/tls/haswell:/usr/local/lib/tls/x86_64:/usr/local/lib/tls:/usr/local/lib/haswell/x86_64:/usr/local/lib/haswell:/usr/local/lib/x86_64:/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v3:/usr/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2:/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu(system search path)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib/x86_64-linux-gnu		(system search path)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib/x86_64-linux-gnu		(system search path)53197:	 search path=/usr/lib		(system search path)53197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	 search path=/usr/lib/x86_64-linux-gnu		(system search path)53197:	find library=libspdlog.so.1.11 [0]; searching53197:	 search path=/usr/lib		(system search path)53197:	  trying file=/usr/lib/libspdlog.so.1.1153197:	 search path=/usr/local/lib		(LD_LIBRARY_PATH)53197:	  trying file=/usr/local/lib/libspdlog.so.1.1153197:	 search path=/usr/lib/x86_64-linux-gnu		(system search path)53197:	  trying file=/usr/lib/x86_64-linux-gnu/libspdlog.so.1.1153197:	 search path=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/glibc-hwcaps/x86-64-v3:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/glibc-hwcaps/x86-64-v2:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/haswell:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/x86_64:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/haswell/x86_64:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/haswell:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/x86_64:/usr/lib/x86_64-linux-gnu/gazebo-11/plugins:/opt/ros/humble/opt/rviz_ogre_vendor/lib/glibc-hwcaps/x86-64-v3:/opt/ros/humble/opt/rviz_ogre_vendor/lib/glibc-hwcaps/x86-64-v2:/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/haswell/x86_64:/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/haswell:/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/x86_64:/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls:/opt/ros/humble/opt/rviz_ogre_vendor/lib/haswell/x86_64:/opt/ros/humble/opt/rviz_ogre_vendor/lib/haswell:/opt/ros/humble/opt/rviz_ogre_vendor/lib/x86_64:/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v3:/opt/ros/humble/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2:/opt/ros/humble/lib/x86_64-linux-gnu/tls/haswell/x86_64:/opt/ros/humble/lib/x86_64-linux-gnu/tls/haswell:/opt/ros/humble/lib/x86_64-linux-gnu/tls/x86_64:/opt/ros/humble/lib/x86_64-linux-gnu/tls:/opt/ros/humble/lib/x86_64-linux-gnu/haswell/x86_64:/opt/ros/humble/lib/x86_64-linux-gnu/haswell:/opt/ros/humble/lib/x86_64-linux-gnu/x86_64:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib/glibc-hwcaps/x86-64-v3:/opt/ros/humble/lib/glibc-hwcaps/x86-64-v2:/opt/ros/humble/lib/tls/haswell/x86_64:/opt/ros/humble/lib/tls/haswell:/opt/ros/humble/lib/tls/x86_64:/opt/ros/humble/lib/tls:/opt/ros/humble/lib/haswell/x86_64:/opt/ros/humble/lib/haswell:/opt/ros/humble/lib/x86_64:/opt/ros/humble/lib		(LD_LIBRARY_PATH)53197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/haswell/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/tls/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/haswell/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/x86_64/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/tls/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/opt/rviz_ogre_vendor/lib/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/tls/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/tls/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64-linux-gnu/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/tls/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/tls/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/haswell/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/x86_64/libspdlog.so.1.1153197:	  trying file=/opt/ros/humble/lib/libspdlog.so.1.1153197:	 search path=/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v3:/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2:/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/lib/glibc-hwcaps/x86-64-v3:/lib/glibc-hwcaps/x86-64-v2:/lib/tls/haswell/x86_64:/lib/tls/haswell:/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:/lib:/usr/lib		(system search path)53197:	  trying file=/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/tls/haswell/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/tls/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/haswell/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/x86_64-linux-gnu/libspdlog.so.1.1153197:	  trying file=/usr/lib/x86_64-linux-gnu/libspdlog.so.1.1153197:	  trying file=/lib/glibc-hwcaps/x86-64-v3/libspdlog.so.1.1153197:	  trying file=/lib/glibc-hwcaps/x86-64-v2/libspdlog.so.1.1153197:	  trying file=/lib/tls/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/tls/haswell/libspdlog.so.1.1153197:	  trying file=/lib/tls/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/tls/libspdlog.so.1.1153197:	  trying file=/lib/haswell/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/haswell/libspdlog.so.1.1153197:	  trying file=/lib/x86_64/libspdlog.so.1.1153197:	  trying file=/lib/libspdlog.so.1.1153197:	  trying file=/usr/lib/libspdlog.so.1.11
./g2oCurveFitting: error while loading shared libraries: libspdlog.so.1.11: cannot open shared object file: No such file or directory

并没有去指定路径查找。说明可能这些库不是程序的直接依赖,而是二级依赖。

排查4:查看一个可执行文件的“动态库依赖链”(递归依赖)
ldd 默认只显示第一层依赖,不会自动展开二级、三级库的链条。
在网上查找到了工具lddtree,它可以:

自动展开所有层级依赖;
显示每个库的实际路径;
用树形结构展示依赖关系。

sudo apt install pax-utils   # apt即可安装koap@koap:~/workspace/slambook2/ch6/build$ lddtree g2oCurveFitting 
g2oCurveFitting => ./g2oCurveFitting (interpreter => /lib64/ld-linux-x86-64.so.2)libg2o_core.so.0.1 => /usr/local/lib/libg2o_core.so.0.1libspdlog.so.1.11 => not foundlibfmt.so.9 => not foundlibg2o_stuff.so.0.1 => /usr/local/lib/libg2o_stuff.so.0.1libopencv_core.so.411 => /usr/local/lib/libopencv_core.so.411libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6

发现spdlog和fmt是libg2o_core.so.0.1的依赖,相当于是可执行文件g2oCurveFitting的二级依赖。
定位到原因:
可执行文件有 RUNPATH,但 libg2o_core.so(位于 /usr/local/lib)是直接依赖 libspdlog/libfmt 的共享库。动态链接器在解析 libg2o_core.so 的依赖时,会优先使用 libg2o_core.so 自身的 rpath/runpath(以及系统搜索路径),不会使用可执行文件的 RUNPATH 来满足“来自另一个共享库的依赖”。所以尽管 g2oCurveFitting 有 runpath,加载 libg2o_core.so 时仍找不到 libspdlog/libfmt。

4. 解决

给 libg2o_core 设置 rpath:

sudo apt install patchelfsudo patchelf --set-rpath /home/koap/3rdparty/spdlog/build:/home/koap/3rdparty/fmt/build /usr/local/lib/libg2o_core.so.0.1
sudo ldconfig

然后可以看到依赖都满足了:

koap@koap:~/workspace/slambook2/ch6/build$ lddtree g2oCurveFitting 
g2oCurveFitting => ./g2oCurveFitting (interpreter => /lib64/ld-linux-x86-64.so.2)libg2o_core.so.0.1 => /usr/local/lib/libg2o_core.so.0.1libspdlog.so.1.11 => /home/koap/3rdparty/spdlog/build/libspdlog.so.1.11ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2libfmt.so.9 => /home/koap/3rdparty/fmt/build/libfmt.so.9libg2o_stuff.so.0.1 => /usr/local/lib/libg2o_stuff.so.0.1libopencv_core.so.411 => /usr/local/lib/libopencv_core.so.411libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6

程序也可以正常运行了。

不过链接中使用了绝对路径,迁移到其他设备时需要注意修改路径。

http://www.gsyq.cn/news/34757.html

相关文章:

  • 2025 年 10 月气缸管厂家推荐排行榜,精密气缸管,不锈钢气缸管,珩磨气缸管,薄壁气缸管,焊接气缸管,冷拔气缸管,食品级气缸管,海洋用气缸管公司推荐
  • 2025 年 10 月三层绝缘线厂家推荐排行榜,东特/大亚/TOTOKU/古河/TIW-2/TIW-3/TIW-4/TIW-E/TIW-2S/TEX-E 三层绝缘线公司推荐
  • 2025年10月精华液推荐榜:淡斑提亮多效精华权威排名发布
  • 2025年读书郎深度解析:26年教育科技长跑的硬实力与隐忧,
  • 2025年10月郑州遗产继承律师选择榜:五强机构公开数据对比与排行
  • 专家并行和其他并行策略对比
  • 2025年热门的坐骑式割草机厂家推荐及选购指南
  • ppt导出高清图片pdf的方法!
  • 完整教程:提升准确率的处理
  • 2025年热门的锌钢阳台栏杆最新TOP厂家排名
  • 在线代办事项 | AI 设计
  • 2025年质量好的RJ45网口插座TOP实力厂家推荐榜
  • STM32与7038芯片通过SPI通信读取寄存器数据
  • 2025年老年急救病房及CPR实训室企业权威推荐榜单:基础护理实训/OT康复实训室 /PT康复实训室源头厂家精选
  • 2025年跨境电商服务商权威推荐榜单:海外跨境电商/跨境电商培训/跨境电商系统服务商精选
  • 色彩空间基础 —— 颜色模式RGB
  • MATLAB的宽频带频谱感知算法仿真
  • 2025年知名的锂电正极材料隔离耐磨涂层最新TOP厂家排名
  • 非时序与时序蒙特卡罗方法对风力发电系统可靠性进行建模
  • 2025年靠谱的氟美斯除尘布袋最新TOP厂家排名
  • 2025年团餐刷卡消费机生产厂家权威推荐榜单:扫码消费机食堂挂式/挂式消费机 /团餐收银机源头厂家精选
  • 完整教程:【burp手机真机抓包】Burp Suite 在真机(Android and IOS)抓包手机APP + 微信小程序详细教程
  • 2025年10月精益降本咨询公司推荐:口碑排行与数据化对比
  • iOS 有线投屏开源了:Windows 直连采集 iPhone 屏幕与音频的完整方案
  • 真实案例解析缓存大热key的致命陷阱
  • 2025 年山东自卸半挂车,济宁自卸半挂车,平推式自卸半挂车厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025年热门的JN30高压均质机TOP品牌厂家排行榜
  • 2025年下半年国内最热门GEO/AI搜索优化/搜荐推广/短视频矩阵系统/无人直播系统/数字人系统/智能体直播厂家摘星搜荐:揭秘领先品牌的创新技术与市场表现
  • HarmonyOS实战项目:开发一个分布式新闻阅读客户端
  • 【渲染优化】动态调整虚拟列表刷新率:让代码学会偷懒