• 9472阅读
  • 19回复

[提问]release和添加了各种dll在其他电脑运行不了 [复制链接]

上一主题 下一主题
离线pangsht
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-07
各位大虾,我的程序涉及数据,用release run过之后,也depend过看需要哪些dll,全都放在一个文件夹里了,copy到U盘在自己电脑运行,没问题;可放到别的电脑(没装Qt)运行,双击程序,啥提示都没有,程序也打不开。不知是哪里出错了~~
请教…………………………感谢!
离线dbzhang800

只看该作者 1楼 发表于: 2011-04-07
depend 是远远不够的!

你可能需要借助进程查看工具,如果你不知道你需要发布哪些东西

http://hi.baidu.com/cyclone/blog/item/d77a86182fb915b84bedbc57.html
离线pangsht
只看该作者 2楼 发表于: 2011-04-07
请问对于发布,进程查看工具是要怎么用呢?
离线dbzhang800

只看该作者 3楼 发表于: 2011-04-07
引用第2楼pangsht于2011-04-07 10:42发表的  :
请问对于发布,进程查看工具是要怎么用呢?

你可以知道正常运行时,它加载了哪些东西,这些东西在你机子的那些地方。
离线pangsht
只看该作者 4楼 发表于: 2011-04-07
哦,我终于看到了,好大一张列表哦,该不会要把这所有的dll都放到文件夹里吧?
离线pangsht
只看该作者 5楼 发表于: 2011-04-07
TO dbzhang800 ,

我已经将所有的dll和其他类型的文件全放进文件夹里了,可到别的电脑还是双击打开没任何反应……
离线oscarboycn

只看该作者 6楼 发表于: 2011-04-07
Qt的库呢?要是用VC编译,那在redist目录的库也要加上
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线dbzhang800

只看该作者 7楼 发表于: 2011-04-07
引用第5楼pangsht于2011-04-07 14:41发表的  :
TO dbzhang800 ,
我已经将所有的dll和其他类型的文件全放进文件夹里了,可到别的电脑还是双击打开没任何反应……

你提供的东西还是太少。不妨介绍一下你都拷贝了什么东西,放到了那个目录中等等

双击没有反应:会不会是你的程序中错误处理做得不够?比如如果你没有发布或没有正确发布数据库的插件,而且代码中也没有相应的处理代码。
离线pangsht
只看该作者 8楼 发表于: 2011-04-07
回 6楼(oscarboycn) 的帖子
我的程序直接在QT上编译,不用VC或VS呢……
离线pangsht
只看该作者 9楼 发表于: 2011-04-07
回 7楼(dbzhang800) 的帖子
不好意思,程序虽说不大,但我在自己电脑里运行是没有错误的,当然不排除您说的可能对一些错误处理的不够。
先说我的程序,程序涉及SQLITE,简单的对数据库读出和写入,一个窗口,控件就一个tableView和一个lineEdit和一个按钮btn,数据库的table也就两属性id和name,先初始化一条记录(1,aaa)给表Test,通过QSqlTableModel显示在tableView中,同时用QDataWidgetMapper映射器将lineEdit的文本映射给表的name属性,点击按钮btn后更新tableView。
我用release生成exe(程序)和dat(数据文件)后,放到U盘的一个英文名文件夹里,再把QtCore4.dll、QtGui4.dll、QtSql4.dll、MingWM10.dll、libgcc_s_dw2-1.dll一起放进去,再用别的电脑整个文件夹复制出来,双击没反应……
再用进程查看工具,把一列表的东西都放进去了,也是没反应……
再在程序里添加了数据文件打开的出错语句:if(!db.open()) { QMessageBox::warning........; return false;}自己电脑里本来也没这个出错的,加了还是能直接运行,且不会弹出这个warning对话框……
离线dbzhang800

只看该作者 10楼 发表于: 2011-04-07
Re:回 7楼(dbzhang800) 的帖子
引用第9楼pangsht于2011-04-07 16:57发表的 回 7楼(dbzhang800) 的帖子 :
不好意思,程序虽说不大,但我在自己电脑里运行是没有错误的,当然不排除您说的可能对一些错误处理的不够。
先说我的程序,程序涉及SQLITE,简单的对数据库读出和写入,一个窗口,控件就一个tableView和一个lineEdit和一个按钮btn,数据库的table也就两属性id和name,先初始化一条记录(1,aaa)给表Test,通过QSqlTableModel显示在tableView中,同时用QDataWidgetMapper映射器将lineEdit的文本映射给表的name属性,点击按钮btn后更新tableView。
我用release生成exe(程序)和dat(数据文件)后,放到U盘的一个英文名文件夹里,再把QtCore4.dll、QtGui4.dll、QtSql4.dll、MingWM10.dll、libgcc_s_dw2-1.dll一起放进去,再用别的电脑整个文件夹复制出来,双击没反应……
再用进程查看工具,把一列表的东西都放进去了,也是没反应……
再在程序里添加了数据文件打开的出错语句:if(!db.open()) { QMessageBox::warning........; return false;}自己电脑里本来也没这个出错的,加了还是能直接运行,且不会弹出这个warning对话框……

给你个建议,写两个最简单的程序,一个使用sqlite插件,一个不使用,然后分别发布试试,看看能不能成功。因为在你前面的描述中,你始终没提到插件的发布问题,把插件作为普通的dll放置是不能解决问题的。
离线pangsht
只看该作者 11楼 发表于: 2011-04-07
整理一下,还是贴代码吧,呵呵~~
+++++++++++++database.h+++++++++++++++++
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
#include <QMessageBox>
#include <QSqlError>

static bool createConnection()
{
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database.dat");
    if(!db.open())
    {
        QMessageBox::warning(0,QObject::tr("Database Error"),db.lastError().text());
        return false;
    }

    QSqlQuery query;
    query.exec(QObject::tr("create table Test(id int primary key,content vchar)"));
    query.exec(QObject::tr("insert into Test values(1,'测试测试测试测试测试测试')"));

    return true;
}
#endif // DATABASE_H

++++++++++++++widget.h++++++++++++++++++
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlTableModel>
#include <QDataWidgetMapper>

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QSqlTableModel *model;
    QDataWidgetMapper *mapper;
};
#endif // WIDGET_H

+++++++++++widget.cpp+++++++++++++
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTextEdit>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    model=new QSqlTableModel(this);
    model->setTable("Test");
    model->setHeaderData(0,Qt::Horizontal,QObject::tr("编号"));
    model->setHeaderData(1,Qt::Horizontal,QObject::tr("内容"));
    model->select();

    ui->tableView->setModel(model);
    ui->tableView->resizeColumnsToContents();

    mapper=new QDataWidgetMapper(this);
    mapper->setModel(model);
    mapper->addMapping(ui->lineEdit,1);
    mapper->toFirst();
}

Widget::~Widget()
{
    delete ui;
}

++++++++++++main.cpp+++++++++++++++
#include <QtGui/QApplication>
#include "widget.h"
#include "database.h"
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    if(!createConnection())
        return 0;
    Widget w;
    w.show();
    return a.exec();
}
离线pangsht
只看该作者 12楼 发表于: 2011-04-07
不使用SQLITE,就可以发布……
离线dbzhang800

只看该作者 13楼 发表于: 2011-04-07
    if(!createConnection())
        return 0;

呵呵,你这句代码有意思啊。什么不显示,直接退出,不正是你做的么?

题外:还是前面提的,你始终没讲到你有没有发布数据库插件,有没有正确发布?
离线pangsht
只看该作者 14楼 发表于: 2011-04-07
啊??那应该怎么改?这句代码也是看一些demo里拿来的。。。意思不是链接不成功便退出吗?难道拿到别的电脑就真的链接不了数据库……?

我添加了QtSql4.dll和QtSqlite4.dll,不知还需要什么插件来发布,怎么才叫正确发布呢?

谢谢!
离线dbzhang800

只看该作者 15楼 发表于: 2011-04-07
离线pangsht
只看该作者 16楼 发表于: 2011-04-07
还是不行。。。
离线dbzhang800

只看该作者 17楼 发表于: 2011-04-07
引用第16楼pangsht于2011-04-07 20:13发表的  :
还是不行。。。

你不能描述下你做了什么么?特别是插件部分。
离线pangsht
只看该作者 18楼 发表于: 2011-04-07
抱歉……不是我刻意回避问题,我刚才在14楼已经说了,我不知道需要什么插件,我只是按照depend还有您之前说的进程工具,找了很多的dll放进文件夹……

基础薄弱的说……
离线pangsht
只看该作者 19楼 发表于: 2011-04-08
今天无意中搜索到答案就在本论坛!太爽了~~

http://www.qtcn.org/bbs/read.php?tid=34861

感谢各位前辈!
快速回复
限100 字节
 
上一个 下一个