3

我正在尝试为一个项目学习 Wt,现在我正在尝试学习其中的数据库部分。

我一开始就卡住了。我正在尝试从 dbo 教程中学习它(网站http://www.webtoolkit.eu/wt/doc/tutorial/dbo/tutorial.html#_installing_tt_wt_dbo_tt中有一个教程),该教程位于示例中wt包(tutorial1.C)

我在 ubuntu 中使用 Qt 编译器(5.)。正如网站教程(上面链接)中所说,我已经构建了 Wt::Dbo 库。问题是它仍然给出一个错误;

找不到 lGL
collect2:ld 返回 1 个退出状态

这是Wt中的代码(直接从tutorial1.C复制)

/*
 * Copyright (C) 2010 Emweb bvba, Kessel-Lo, Belgium.
 *
 * See the LICENSE file for terms of use.
 */

/*****
 * This file is part of the Wt::Dbo tutorial:
 * http://www.webtoolkit.eu/wt/doc/tutorial/dbo/tutorial.html
 *****/

#include <Wt/Dbo/Dbo>
#include <Wt/Dbo/backend/Sqlite3>
#include <string>

namespace dbo = Wt::Dbo;

/*****
 * Dbo tutorial section 2. Mapping a single class
 *****/

class User {
public:
  enum Role {
    Visitor = 0,
    Admin = 1,
    Alien = 42
  };

  std::string name;
  std::string password;
  Role        role;
  int         karma;

  template<class Action>
  void persist(Action& a)
  {
    dbo::field(a, name,     "name");
    dbo::field(a, password, "password");
    dbo::field(a, role,     "role");
    dbo::field(a, karma,    "karma");
  }
};

void run()
{
  /*****
   * Dbo tutorial section 3. A first session
   *****/

  /*
   * Setup a session, would typically be done once at application startup.
   *
   * For testing, we'll be using Sqlite3's special :memory: database. You
   * can replace this with an actual filename for actual persistence.
   */
  dbo::backend::Sqlite3 sqlite3(":memory:");
  sqlite3.setProperty("show-queries", "true");
  dbo::Session session;
  session.setConnection(sqlite3);

  session.mapClass<User>("user");

  /*
   * Try to create the schema (will fail if already exists).
   */
  session.createTables();

  {
    dbo::Transaction transaction(session);

    User *user = new User();
    user->name = "Joe";
    user->password = "Secret";
    user->role = User::Visitor;
    user->karma = 13;

    dbo::ptr<User> userPtr = session.add(user);
  }

  /*****
   * Dbo tutorial section 4. Querying objects
   *****/

  {
    dbo::Transaction transaction(session);

    dbo::ptr<User> joe = session.find<User>().where("name = ?").bind("Joe");

    std::cerr << "Joe has karma: " << joe->karma << std::endl;

    dbo::ptr<User> joe2 = session.query< dbo::ptr<User> >
      ("select u from user u").where("name = ?").bind("Joe");
  }

  {
    dbo::Transaction transaction(session);

    typedef dbo::collection< dbo::ptr<User> > Users;

    Users users = session.find<User>();

    std::cerr << "We have " << users.size() << " users:" << std::endl;

    for (Users::const_iterator i = users.begin(); i != users.end(); ++i)
      std::cerr << " user " << (*i)->name
        << " with karma of " << (*i)->karma << std::endl;
  }

  /*****
   * Dbo tutorial section 5. Updating objects
   *****/

  {
    dbo::Transaction transaction(session);

    dbo::ptr<User> joe = session.find<User>().where("name = ?").bind("Joe");

    joe.modify()->karma++;
    joe.modify()->password = "public";
  }

  {
    dbo::Transaction transaction(session);
    dbo::ptr<User> joe = session.find<User>().where("name = ?").bind("Joe");
    if (joe)
      joe.remove();
  }

  {
    dbo::Transaction transaction(session);

    dbo::ptr<User> silly = session.add(new User());
    silly.modify()->name = "Silly";
    silly.remove();
  }

}

int main(int argc, char **argv)
{
  run();
}

提前致谢

4

2 回答 2

2

似乎由于 .pro 文件而出现问题。我不确定它是如何工作的,但是当我第一次实现它时替换了 pro 文件时问题就消失了(从另一个 .pro 文件复制粘贴,几乎没有修改,第一个和最后一个之间应该没有任何区别一)。

于 2014-10-17T07:55:20.300 回答
2

首先,您需要了解 Qt 不是编译器。它是用于开发跨平台应用程序和 GUI 的框架。我相信,您可能也在使用 Qt Creator,它是一个 IDE。实际的编译器可能是 gcc、clang、msvc 或其他。链接错误表明您将其构建为 gui 应用程序。在您的 pro 文件中添加 'CONFIG -= qt' 将解决该问题。或者,在创建新项目时选择 Non-Qt Project->Plain C++ Application。

于 2018-01-17T09:55:46.523 回答