1

我已经使用 Qt 库为在 Linux 上运行的嵌入式设备编写了一个程序,该程序由Buildroot 生成。为了启动我的程序,我创建了一个名为S80custom并将其放置在/etc/init.d/目录中的脚本。脚本的内容是:

#!/bin/sh

if [ ! -d "/root/files/" ]; then
    mkdir /root/files/
fi

if [ ! -d "/root/Test/" ]; then
    mkdir /root/Test/
fi

if [ ! -d "/root/Test/Log/" ]; then
    mkdir /root/Test/Log/
fi

export TSLIB_CONSOLEDEVICE='none'
export TSLIB_FBDEVICE='/dev/fb0'
export TSLIB_TSDEVICE='/dev/input/event1'
export TSLIB_PLUGINDIR='/usr/lib/ts'
export TSLIB_CONFFILE='/etc/ts.conf'
export TSLIB_CALIBFILE='/etc/pointercal'
export QWS_MOUSE_PROTO=tslib:'/dev/input/event1'

/root/Test/Test -qws

但是,当我的程序在系统启动时运行时,它无法访问放置在/root/files. 我已经使用QFile了类及其成员函数。我已经尝试过标准 C++ 库并且它们可以工作,但奇怪的是 QFile 无法打开文件,我必须使用 QFile 来完成这项任务。

我在这里做错了什么?

我还应该在这里提到,当我登录后从命令提示符运行我的应用程序时,它可以完美运行。

编辑
根据评论中的要求,这是假设打开文件的代码部分:

QDir directory = QDir::home();
if(!directory.cd("files")){
    LOG << directory << "does not exist or path incorrect. trying to make it";
    if(directory.mkdir("files"))
    {
        LOG << "made directory \"files\" at" << directory.absolutePath();
        directory.cd("files");
    }
    else
        LOG << "couldn't make diretory... do we have enough priviledges?";
}

fileName = directory.absoluteFilePath("PARMLIST.BIN");

qDebug() << "filename to open:" << fileName;


QFile file(fileName);
QDataStream in(&file);

if(!file.open(QIODevice::ReadOnly))
{
    if(CONF_INT("rdu.active") != 1)
        AlarmManager::getInstance().setAlarm(102, true);
    else
        AlarmManager::getInstance().setAlarm(184, true);
    paramMissing = true;

    return;
}

设置警报的机制已激活,该代码告诉我文件丢失或损坏。除此之外,我没有任何错误。我也尝试将完整路径作为文件名,但这也不起作用。

4

1 回答 1

1

我怀疑您的问题是由于缺少环境变量造成的。

让我们从这里开始:

在非 Windows 操作系统下,使用 HOME 环境变量(如果存在),否则使用 rootPath() 返回的路径。

所以,如果你登录,你已经正确设置了 HOME 变量并且它可以工作,但是当你从 init 启动程序时,你没有它。尝试添加

export HOME="/root"

给你初始化脚本

于 2013-06-02T21:20:08.743 回答