C++ 为什么QDir::exists()不能在docker容器中工作?

C++ 为什么QDir::exists()不能在docker容器中工作?,c++,qt,docker,kde,qdir,C++,Qt,Docker,Kde,Qdir,在我的主机KDE Neon machine中执行的以下程序(最新升级到18.04)输出Hello World!1按预期输出Hello World!0从使用下面的Docker文件构建的Docker容器中执行,并使用sudo Docker run-it qdir运行时 QDir是否需要运行dbus或其他服务 C++程序: #include <QDir> #include <iostream> int main(int argc [[maybe_unused]], char

在我的主机KDE Neon machine中执行的以下程序(最新升级到18.04)输出
Hello World!1
按预期输出
Hello World!0
从使用下面的Docker文件构建的Docker容器中执行,并使用
sudo Docker run-it qdir运行时

QDir是否需要运行dbus或其他服务

C++程序:

#include <QDir>
#include <iostream>


int main(int argc [[maybe_unused]], char** argv [[maybe_unused]])
{
    QDir d("/");
    std::cout << "Hello World! " << d.exists() << std::endl;
    return 0;
}
编辑,CMakeLists.txt以构建程序:

project(qdir)

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
set(QT_MIN_VERSION "5.3.0")

find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core)

include_directories(${Qt5Core_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})

set(qdir_SRCS main.cpp)

add_executable(qdir ${qdir_SRCS})
target_link_libraries(qdir ${Qt5Core_LIBRARIES})

install(TARGETS qdir RUNTIME DESTINATION bin)
Edit2: 我创建了一个github项目,重新组合了上述所有内容。要重现问题,如果您有Qt SDK、cmake、ninja和docker,只需执行以下操作:

git clone https://github.com/kleag/qdirtest
cd qdirtest
./test.sh
这是我得到的输出:

$ ./test.sh
[…]
Successfully built f710cbb7a3c9
Successfully tagged qdir:latest
Hello World! 1
Hello World! 0

我从阿帕切洛格那里得到了答案:

因为5.10 Qt使用了一些新的系统调用。其中一个是statx 最后我检查了系统调用在docker中没有被列入白名单,也没有 它是可白名单的,因为libseccomp用于上游docker build太旧了,不知道statx是什么。机会是最大的 你们看到的问题是。如果是这样,seccomp=unconfined将使其工作


你可以包含运行C++@ Max的命令,我编辑了这个问题,添加了C++文件来构建C++程序。请提取一个,这意味着从源代码中消除QT。原因是你在问一个关于Qt中的代码的问题,而你展示的代码只是调用它。@ulrich eckhardt,现在我添加了cmakelists.txt,它是最小的、完整的和可验证的。我无法删除Qt,因为我试图解决的问题是QDir对象的错误行为。只需将代码一起复制到一个文件中即可。然后拆下不需要的零件。顺便说一句:找出错误的另一种方法是使用
strace
运行可执行文件,它将显示所进行的系统调用。但是,涉及的代码越少越好,而且“很少的代码”并不是通常与Qt相关联的东西
$ ./test.sh
[…]
Successfully built f710cbb7a3c9
Successfully tagged qdir:latest
Hello World! 1
Hello World! 0