【问题标题】:QSqlDatabase: QTDS driver not loadedQSqlDatabase:未加载 QTDS 驱动程序
【发布时间】:2014-02-07 13:13:30
【问题描述】:

我有一个使用 QTDS 驱动程序的程序。

在开发环境中一切正常。 在生产中,我同时拥有具有适当权限的 TDS 插件和 sybdb。

  1. -rwxr-xr-x 1 foxprd foxprd 47880 1 月 29 日 17:33 libqsqltds.so*
  2. -rwxr-xr-x 1 foxprd foxprd 472579 1 月 29 日 17:33 libsybdb.so*

它们都在一个已添加到 LD_LIBRARY_PATH 的目录中

但我得到了

QSqlDatabase: QTDS driver not loaded

编辑 我也可以说:

app.libraryPaths()

指向一个目录,其中有一个包含所有库的 sqldrivers/ 目录 如果我在 dev 中重命名这个目录,我会得到同样的错误,如果我把它放回去,它会再次工作。

  1. MyappDir/sqldrivers/libqsqltds.so
  2. MyappDir/sqldrivers/libsybdb.so
  3. MyappDir/sqldrivers/libsybdb.so.5

在 dev 中,当且仅当此目录在这里时,它才有效。在 Prod 中,这两种情况都不起作用。虽然“MyappDir/”总是列在

app.libraryPaths()

【问题讨论】:

    标签: qt qsqldatabase


    【解决方案1】:

    自我回答:

    当一个 linux 应用程序加载时,它需要能够访问它需要的所有 libXXX.so。 “ld”将在“LD_LIBRARY_PATH”变量中声明的任何目录中查找它们

    但是 Qt 似乎从一些可以在那里找到的路径动态加载它的插件:

    QCoreApplication app(argc,argv);
    qDebug() << app.libraryPaths();
    

    打印出来的

    ("/my/App/Path","/Qt/Dir/Path" )

    它应该从其中一个路径加载插件。所以如果在 qtDir 你有

    /Qt/Dir/Path/plugins/sqldrivers/libqsqltds.so
    

    您要确保部署如下内容:

    /my/App/Path/sqldrivers/libqsqltds.so
    

    这很好用,因为应用程序路径始终位于“app.libraryPaths()”中。但是,当事情变得复杂时,libqsqltds.so 需要“libsybdb.so.5”才能正常工作。我知道所以也有一个

    /my/App/Path/sqldrivers/libsybdb.so.5 
    

    这是错误的,因为 Qt 动态加载 libqsqltds.so 而不是它的依赖项,似乎 ld 期望找到通常的方式(例如在 LD_LIBRARY_PATH 中)

    事实上,在我的开发/集成环境中,我的路径中有 libsybdb.so.5,但在我的生产环境中没有。

    因此,无论您需要什么 Qt 插件,请确保将插件目录(仅包含 .so 内部)复制到您的生产环境。并确保执行:

    ldd  /my/App/Path/sqldrivers/libsybdb.so.5
    

    不会打印任何“未找到”,因为这些依赖项不会出现:

    ldd  /my/App/Path/myAppBin
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多