Линкер во втором Docker слое не находит общие библиотеки OpenCV, созданные в предыдущем слое, но файлы существуют - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать docker образ с OpenCV 4.3 и моей собственной программой на C ++, связанной с OpenCV, обе созданы для Linux. Поскольку создание OpenCV занимает довольно много времени, а результирующее изображение docker довольно большое и мне нужны только libopencv_core.so и libopencv_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 ...

1 Ответ

1 голос
/ 17 апреля 2020

В постах 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*

(Разрывы строк и \ добавлены только для облегчения чтения для some)

Длинный список ls -l / usr / local / lib / libopencv_ * из сгенерированной системы для подтверждения.

...