docker - KDE目的构建仅在Docker容器中失败

标签 docker gcc kde

当前,最新的KDE / Archlinux版本遇到一个奇怪的问题。
尽管KDE的Purpose框架可以在我们的主机上正常运行,但我们无法在Docker容器中进行编译。我们试图用GCC和Clang编译它。

我们收到的错误是:

CMakeFiles/saveasplugin.dir/saveasplugin.cpp.o: In function `SaveAsShare::SaveAsShare()':
saveasplugin.cpp:(.text+0x81): undefined reference to `vtable for SaveAsShare'
CMakeFiles/saveasplugin.dir/saveasplugin.cpp.o: In function `SaveAsShare::~SaveAsShare()':
saveasplugin.cpp:(.text+0x113): undefined reference to `vtable for SaveAsShare'
CMakeFiles/saveasplugin.dir/saveasplugin.cpp.o: In function `SaveAsShare::~SaveAsShare()':
saveasplugin.cpp:(.text+0x133): undefined reference to `vtable for SaveAsShare'
collect2: error: ld returned 1 exit status
make[2]: *** [src/plugins/saveas/CMakeFiles/saveasplugin.dir/build.make:122: bin/kf5/purpose/saveasplugin.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:1149: src/plugins/saveas/CMakeFiles/saveasplugin.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

您可以使用以下Dockerfile来复制Docker环境:
FROM archlinux/base
RUN pacman -Syu --noconfirm && pacman --noconfirm -S git base-devel cmake extra-cmake-modules asp sudo
RUN useradd -ms /bin/bash arch
RUN echo 'arch ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers
USER arch
WORKDIR /home/arch
RUN asp checkout purpose
WORKDIR /home/arch/purpose/trunk
RUN gpg --keyserver ipv4.pool.sks-keyservers.net --recv-keys 58D0EE648A48B3BB

(如果只有IPv6可用而没有IPv4,则需要编辑第9行)

构建容器后,运行它并执行makepkg -s --noconfirm
现在它将构建archlinux软件包,并且在链接阶段您将遇到上述错误。

目前,我们甚至根本不知道此错误的原因是什么,因为它在我们的主机上没有任何问题地生成。有任何想法吗?

我们还测试了不同的基本archlinux docker镜像,例如pritunl / archlinux。

环境:
目的:5.43.0-1
GCC:7.3.0
清除:5.0.1-2

最佳答案

这是statx用于生成适当的cpp文件的MOC系统调用的错误。在默认的受限配置中,docker使用seccomp阻止或允许某些syscall,这不允许statx syscall。有关允许的系统调用,请参见this

已经在archlinux bugtrackerqt bugtrackerdocker bugtracker上报告了此错误,没有(永久)解决方案。

解决方案1:
根据this建议使用docker run --security-opt seccomp:unconfined运行您的docker容器。

解决方案2:
修补或降级以从qt中删除statx系统调用。

关于docker - KDE目的构建仅在Docker容器中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876001/

相关文章:

docker - Gitlab选项作为Docker镜像存储库

c++ - 这是什么类型的行为?

c++ - C++ 中的 Linux 控制台命令(gcc 编译器)

python - 设计python kde小部件

angular - 从Linux创建ASP.NET Core 3.0 Angular Web应用程序镜像

docker - 将Elasticsearch日志迁移到其他集群

c++ - 如何在 windowsservercore docker 容器中安装 dotnetcore

用于调用函数的代码存储器(C ARM-GCC)

R - 如何在特定轮廓内找到点

matplotlib - Matplotlib 中带有边缘 KDE 图和多个类别的散点图