【问题标题】:Can't build qtpdf in docker container无法在 docker 容器中构建 qtpdf
【发布时间】:2020-01-16 00:19:11
【问题描述】:

我正在使用 C++ 中的 qtpdf 使用 Qt 开发应用程序。 我想为我的项目设置 gitlab CI,所以我试图在 docker 容器中编译和运行测试,以便为 CI 创建 docker 映像。 虽然我在我的机器上编译 qtpdf 没有问题,但我不能在 docker 容器中这样做。

这是我的编译日志(来自错误):

g++ -Wl,-z,relro -Wl,--as-needed -Wl,--no-undefined -Wl,--version-script,QtPdf.version -Wl,-O1 -Wl,--enable-new-dtags -shared -Wl,-Bsymbolic-functions -Wl,-soname,libQt5Pdf.so.5 -o libQt5Pdf.so.5.9.0 .obj/jsbridge.o .obj/qpdfbookmarkmodel.o .obj/qpdfdocument.o .obj/qpdfpagenavigation.o .obj/qpdfpagerenderer.o .obj/moc_qpdfnamespace.o .obj/moc_qpdfpagerenderer.o  -lQt5Gui -lQt5Core -lpthread -L/soundpdf/src/3rdparty/qtpdf/lib -lqtpdfium -lQt5Network -lQt5Core -lpthread -lGL 
/usr/bin/ld: .obj/qpdfbookmarkmodel.o: in function `QPdfBookmarkModel::setStructureMode(QPdfBookmarkModel::StructureMode)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:177: undefined reference to `FPDFBookmark_GetFirstChild'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:190: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:193: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:195: undefined reference to `FPDFBookmark_GetDest'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:196: undefined reference to `FPDFDest_GetPageIndex'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:205: undefined reference to `FPDFBookmark_GetNextSibling'
/usr/bin/ld: .obj/qpdfbookmarkmodel.o: in function `QPdfBookmarkModel::setDocument(QPdfDocument*)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:177: undefined reference to `FPDFBookmark_GetFirstChild'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:190: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:193: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:195: undefined reference to `FPDFBookmark_GetDest'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:196: undefined reference to `FPDFDest_GetPageIndex'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:205: undefined reference to `FPDFBookmark_GetNextSibling'
/usr/bin/ld: .obj/qpdfbookmarkmodel.o: in function `QPdfBookmarkModel::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:177: undefined reference to `FPDFBookmark_GetFirstChild'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:190: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:193: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:195: undefined reference to `FPDFBookmark_GetDest'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:196: undefined reference to `FPDFDest_GetPageIndex'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:205: undefined reference to `FPDFBookmark_GetNextSibling'
/usr/bin/ld: .obj/qpdfbookmarkmodel.o: in function `QPdfBookmarkModelPrivate::appendChildNode(BookmarkNode*, void*, int, void*)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:177: undefined reference to `FPDFBookmark_GetFirstChild'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:190: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:193: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:195: undefined reference to `FPDFBookmark_GetDest'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:196: undefined reference to `FPDFDest_GetPageIndex'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:205: undefined reference to `FPDFBookmark_GetNextSibling'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfbookmarkmodel.cpp:190: undefined reference to `FPDFBookmark_GetTitle'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::updateLastError() [clone .part.25]':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:134: undefined reference to `FPDF_GetLastError'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::initiateAsyncLoadWithTotalSizeKnown(unsigned long long)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:221: undefined reference to `FPDFAvail_Create'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::tryLoadDocument()':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:243: undefined reference to `FPDFAvail_IsDocAvail'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:248: undefined reference to `FPDFAvail_GetDocument'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:254: undefined reference to `FPDF_CloseDocument'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::checkComplete()':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:277: undefined reference to `FPDF_GetPageCount'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:281: undefined reference to `FPDFAvail_IsPageAvail'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocument::pageSize(int) const':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:554: undefined reference to `FPDF_GetPageSizeByIndex'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocument::render(int, QSize, QPdfDocumentRenderOptions)':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:575: undefined reference to `FPDF_LoadPage'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:581: undefined reference to `FPDFBitmap_CreateEx'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:616: undefined reference to `FPDF_RenderPageBitmap'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:618: undefined reference to `FPDFBitmap_Destroy'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:620: undefined reference to `FPDF_ClosePage'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocument::metaData(QPdfDocument::MetaDataField) const':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:476: undefined reference to `FPDF_GetMetaText'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:479: undefined reference to `FPDF_GetMetaText'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::QPdfDocumentPrivate()':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:72: undefined reference to `FPDF_InitLibrary'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::clear()':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:103: undefined reference to `FPDF_CloseDocument'
/usr/bin/ld: /soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:107: undefined reference to `FPDFAvail_Destroy'
/usr/bin/ld: .obj/qpdfdocument.o: in function `QPdfDocumentPrivate::~QPdfDocumentPrivate()':
/soundpdf/src/3rdparty/qtpdf/src/pdf/qpdfdocument.cpp:95: undefined reference to `FPDF_DestroyLibrary'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:101: ../../lib/libQt5Pdf.so.5.9.0] Error 1
make[2]: Leaving directory '/soundpdf/src/3rdparty/qtpdf/src/pdf'
make[1]: *** [Makefile:72: sub-pdf-make_first] Error 2
make[1]: Leaving directory '/soundpdf/src/3rdparty/qtpdf/src'
make: *** [Makefile:47: sub-src-make_first] Error 2

我使用的基础镜像是 debian:latest,安装的包是build-essentialqt5-defaultgitqtbase5-private-dev。我还尝试了 ubuntu:latest 和 ubuntu:disco 并得到了完全相同的错误。 我运行的唯一命令是:

  1. 克隆我的仓库
  2. 下载子模块
  3. qmake
  4. make

前面的命令导致我之前粘贴的错误日志。

为了构建 qtpdf,我错过了什么以及应该做些什么?

【问题讨论】:

  • 显示你的 Dockerfile

标签: c++ qt docker pdf linker


【解决方案1】:

以下 Dockerfile 允许您编译 qtpdf。

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get autoclean

RUN apt-get update && apt-get install \
    -y --no-install-recommends \
    build-essential \
    git \
    ca-certificates \
    qt5-default \
    python2.7 \
    qtbase5-private-dev

RUN ln -sf /usr/bin/python2.7 /usr/bin/python

RUN git clone git://code.qt.io/qt-labs/qtpdf \
    && cd qtpdf \
    && git submodule update --init --recursive \
    && qmake \
    && make \
    && make install

RUN cd qtpdf/examples/pdf/pdfviewer \
    && make

RUN apt-get update && apt-get install \
    -y --no-install-recommends \
    wget

RUN wget https://file-examples.com/wp-content/uploads/2017/10/file-example_PDF_1MB.pdf

CMD qtpdf/examples/pdf/pdfviewer/pdfviewer file-example_PDF_1MB.pdf

然后使用以下命令运行它:

$ docker build --tag=qtpdf .
$ docker run -it \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=$DISPLAY \
    --device /dev/dri \
    qtpdf:latest

【讨论】:

  • 感谢您的回答,实际上我可以通过克隆存储库来构建 qtpdf,但是当我使用命令 git submodule update --init --recursive 下载它时无法这样做(因为 qtpdf 是我项目的子模块)。我添加了具有与克隆存储库相同的 url 的子模块。克隆存储库和将其作为子模块下载时,内容是否有所不同?
  • @7pri2 mmm,我听不懂你,你自己解释清楚,你真正的问题是什么?
  • @7pri2 如果您需要更多帮助,则必须提供minimal reproducible example 来分析问题所在,否则我将无法再为您提供帮助。
  • 我试图隔离一个最小的例子。所以我创建了一个新的 git 存储库并将 qtpdf 添加为子模块 (git submodule add https://gitlab.com/7pri2/reprod.git) 并推送它。然后我启动了一个 docker 容器(安装了 build-essential、git、qt5-default 和 qtbase5-private-dev 的 ubuntu:18.04),克隆了存储库并尝试构建 qtpdf(git submodule update --init --recursive,然后是 qmakemake)这给了我在原始问题中发布的错误。
  • @7pri2 MRE 应该在您的问题中,而不是在 cmets 中,如果您使用的是 docker,那么建议您提供我提供的 Dockerfile,以便社区可以轻松测试它,所以我要求您编辑您的问题并添加一个 MRE 使其易于使用。请阅读How to Ask 并查看tour
猜你喜欢
  • 2023-03-14
  • 2022-08-19
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多