第二Docker层中的链接器未找到在上一层中构建的共享OpenCV库,但是文件存在

问题描述 投票:0回答:1

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

  1. 从源代码构建OpenCV并构建我自己的与OpenCV链接的C ++程序
  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 ...
c++ linux docker shared-libraries
1个回答
0
投票

在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_ *的长列表。

© www.soinside.com 2019 - 2024. All rights reserved.