当前位置: 首页 > 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.jsqmd.com/news/26459/

相关文章:

  • 2025 年 10 月气缸管厂家推荐排行榜,精密气缸管,不锈钢气缸管,珩磨气缸管,薄壁气缸管,焊接气缸管,冷拔气缸管,食品级气缸管,海洋用气缸管公司推荐
  • 2025年评价高的格栅机维修厂家推荐及采购参考
  • 2025年口碑好的中温伴热带厂家最新用户好评榜
  • 2025年10月卖得好的学习机品牌推荐:销量榜排行与可信评测
  • 2025 年 10 月三层绝缘线厂家推荐排行榜,东特/大亚/TOTOKU/古河/TIW-2/TIW-3/TIW-4/TIW-E/TIW-2S/TEX-E 三层绝缘线公司推荐
  • 2025年10月卖得好的学习机品牌推荐:销量榜对比指南
  • [题解]G. Puzzle II - The 3rd Universal Cup. Stage 2: Zielona Gra
  • 2025年10月精华液推荐榜:淡斑提亮多效精华权威排名发布
  • 2025年10月教育资源好的学习机品牌推荐:家长关注榜对比与实测排行
  • 2025年10月教育资源好的学习机品牌推荐:热门榜数据化评价
  • 2025年10月性价比高的学习机品牌推荐:市场销量榜解析高价值学习方案
  • 2025年读书郎深度解析:26年教育科技长跑的硬实力与隐忧,
  • 2025年读书郎深度解析:26年教育科技长跑的硬实力与隐忧。
  • 2025 年 10 月中央空调厂家推荐排行榜,美的/海信/大金/格力/约克/海尔,商用中央空调,家用中央空调,工业中央空调安装维修服务优质品牌精选
  • 2025年10月精华液排行榜:多肤质适配的精选清单
  • 2025 年 10 月砂磨机厂家推荐排行榜,立式砂磨机,立式纳米砂磨机,小型立式砂磨机公司推荐,高效研磨与稳定性能深度解析
  • 2025年10月郑州遗产继承律师对比榜:真实口碑与案例全解析
  • 2025年10月黄褐斑改善产品推荐榜:五款明星单品多维度对比排行
  • 2025年热门的叉车高压直流继电器厂家最新推荐排行榜
  • 2025年10月郑州遗产继承律师选择榜:五强机构公开数据对比与排行
  • 2025年比较好的不锈钢保温杯优质厂家推荐榜单
  • 2025 年 10 月气动执行器厂家推荐排行榜,齿轮齿条执行器,拨叉式执行器,角行程执行器,不锈钢执行器,三段式执行器,快速执行器,执行器附件,气动执行器附件公司推荐
  • 2025年评价高的汤锅不粘锅最新TOP厂家排名
  • 2025年比较好的五轴零配件机械加工品牌厂家排行榜
  • 2025年评价高的电火花线切割机床厂家推荐及选择参考
  • 07、Linux 材料管理
  • 2025年比较好的后壁半圆管厂家推荐及采购参考
  • 完整教程:Deep Learning|01 RBF Network
  • 个人微信号二次开发api协议,微信个人号开发API接口
  • HTML常规 - ng