第二Docker层中的Linker没有'找不到在上一层中构建的共享OpenCV库,但存在文件



我正试图用OpenCV 4.3和我自己的C++程序创建一个docker映像,这两个程序都是为Linux构建的。因为构建OpenCV需要相当长的时间,并且生成的docker映像非常大,而且我只需要libopencv_core.solibopencv_calib3d.so,所以我尝试创建以下两层:

  1. 从源代码构建OpenCV,并构建我自己的C++程序,该程序链接到OpenCV
  2. 将共享的OpenCV库和我在第一个构建层中创建的编译程序复制到第二个层并执行我的程序

不幸的是,链接器输出

error while loading shared libraries: libopencv_core.so.4.3: cannot open shared object file: No such file or directory

添加

RUN ls /usr/local/lib

在第二层中,就在执行程序的命令显示我成功复制了构建的库文件之前:

libopencv_calib3d.so
libopencv_calib3d.so.4.3
libopencv_calib3d.so.4.3.0
libopencv_core.so
libopencv_core.so.4.3
libopencv_core.so.4.3.0

我已经尝试过这些语句来使库可见:

RUN ldconfig /usr/local/lib
RUN export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib"
RUN ldconfig -v

其中ldconfig -v打印(除其他外(:

/usr/local/lib:
libopencv_calib3d.so.4.3 -> libopencv_calib3d.so.4.3.0
libopencv_core.so.4.3 -> libopencv_core.so.4.3.0

我有点困惑,因为ldconfig没有列出libopencv_calib3d.so,这就是为什么我尝试手动创建simlink,但它抱怨libopencv_calib3d.so已经存在。所以似乎一切都在那里运行我的程序。有什么建议我做错了什么吗?



附录

这是我正在使用的Dockerfile(简化为重要部分(:

FROM vookimedlo/ubuntu-clang:clang_bionic AS builder
# Install dependencies
RUN apt-get update & ...
ARG libPath=/usr/local/lib
# Install OpenCV
RUN git clone & cmake & make install
tar -czvf ${libPath}/opencv.tar.gz /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_calib3d.so.4.* /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_core.so.4.*
# Download and build my program
...
FROM ubuntu AS runtime
ARG libPath=/usr/local/lib
# Copy compiled libraries
COPY --from=builder ${libPath}/opencv.tar.gz ${libPath}/opencv.tar.gz
RUN tar -xvf ${libPath}/opencv.tar.gz -C / && rm ${libPath}/opencv.tar.gz
# Copy my program
...
RUN ldconfig /usr/local/lib
RUN export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib"
RUN ldconfig -v
# Run my program
CMD ...

在OP的帖子中,他们提到使用.so.4.*。这不会得到.so.4文件,只有.so.4。文件。我怀疑发生的是.so->.so.4->so.4->.so.4.3->.so.4.3.0链接链缺少一个链接。

要解决此问题,请使用以下行:

# Install OpenCV
RUN git clone & cmake & make install
tar -czvf ${libPath}/opencv.tar.gz /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_calib3d.so.4.* /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_core.so.4.*

应更新为:

# Install OpenCV
RUN git clone & cmake & make install
tar -czvf ${libPath}/opencv.tar.gz 
/usr/local/lib/libopencv_calib3d.so*  
/usr/local/lib/libopencv_core.so*

(换行和添加只是为了让一些人更容易阅读(

要确认的生成系统中的ls-l/usr/local/lib/libopencv_*的长列表。

最新更新