当前,最新的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 bugtracker,qt bugtracker和docker bugtracker上报告了此错误,没有(永久)解决方案。
解决方案1:
根据this建议使用docker run --security-opt seccomp:unconfined
运行您的docker容器。
解决方案2:
修补或降级以从qt中删除statx系统调用。
关于docker - KDE目的构建仅在Docker容器中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876001/