第二 Docker 层中的链接器未找到在上一层中构建的共享 OpenCV 库,但文件存在
Linker in second Docker layer doesn't find shared OpenCV libraries built in previous layer, but files exist
我正在尝试使用 OpenCV 4.3 和我自己的链接到 OpenCV 的 C++ 程序创建一个 docker 图像,两者都是为 Linux 构建的。因为构建 OpenCV 需要相当长的时间,并且生成的 docker 图像非常大,我只需要 libopencv_core.so
和 libopencv_calib3d.so
,所以我尝试创建以下 两层 :
- 从源代码构建 OpenCV 并构建我自己的链接到 OpenCV 的 C++ 程序
- 将共享的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 post 他们提到使用 .so.4.*
这不会得到 .so.4 文件,只有 .so.4。文件。我怀疑正在发生的事情是 .so -> .so.4 -> so.4-> .so.4.3 -> .so.4.3.0 link 链缺少 link。
要解决此问题,请执行以下几行:
# 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_* 从生成的系统中确认。
我正在尝试使用 OpenCV 4.3 和我自己的链接到 OpenCV 的 C++ 程序创建一个 docker 图像,两者都是为 Linux 构建的。因为构建 OpenCV 需要相当长的时间,并且生成的 docker 图像非常大,我只需要 libopencv_core.so
和 libopencv_calib3d.so
,所以我尝试创建以下 两层 :
- 从源代码构建 OpenCV 并构建我自己的链接到 OpenCV 的 C++ 程序
- 将共享的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 post 他们提到使用 .so.4.*
这不会得到 .so.4 文件,只有 .so.4。文件。我怀疑正在发生的事情是 .so -> .so.4 -> so.4-> .so.4.3 -> .so.4.3.0 link 链缺少 link。
要解决此问题,请执行以下几行:
# 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_* 从生成的系统中确认。