moc在Docker容器中使用Qt 5.10的“未定义接口”失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了moc在Docker容器中使用Qt 5.10的“未定义接口”失败相关的知识,希望对你有一定的参考价值。

一个非常简单的Qt项目无法使用Qt 5.10在Docker容器中构建(具有从opensuse:tumbleweed派生的图像)。该项目如下:

sh-4.4# cat test.pro
TEMPLATE = app
TARGET = test
INCLUDEPATH += .
INCLUDEPATH += sub
HEADERS = obj.h sub/iface.h
SOURCES = obj.cpp main.cpp

sh-4.4# cat sub/iface.h
#pragma once

#include <QtPlugin>

class Interface
{
public:
        virtual ~Interface () {}
};

Q_DECLARE_INTERFACE (Interface, "org.meh.interface/1.0")

sh-4.4# cat obj.h
#pragma once

#include <QObject>
#include <sub/iface.h>

class Obj : public QObject
{
        Q_OBJECT
        Q_INTERFACES (Interface)
};

sh-4.4# cat obj.cpp
#include "obj.h"

sh-4.4# cat main.cpp
int main() {}

在这种情况下,moc抱怨如下:

obj.h:9: Error: Undefined interface

在Qt 5.9的另一个容器中一切都很好,当项目在openSUSE Build Service(使用其他东西而不是Docker)中构建时,Qt 5.10的一切都很好。一些快速谷歌搜索没有透露最近的Qt版本的任何相关的bug报告。

可能有什么不对?

答案

在strace下运行moc显示Operation not permitted在各种statx调用,这揭示了它为什么失败(也与this问题有关)。 This拉请求有望解决这个问题。

另一答案

您是否尝试使用--privileged运行容器(请参阅Which capabilities are needed for statx to stop giving EPERM)?

以上是关于moc在Docker容器中使用Qt 5.10的“未定义接口”失败的主要内容,如果未能解决你的问题,请参考以下文章

Qt - moc 导致 C2504:基类未定义

Qt moc_mainwindow

为啥在 Qt 源代码文件末尾包含“.moc”文件很重要?

使用 Python (PyQT 5.10) 在 QT 5.10 中加载自己的字体

QT:找不到moc文件

qt中moc的作用