QSqlDatabase:未加载QTDS驱动程序

时间:2014-02-07 13:13:30

标签: qt qsqldatabase

我有一个使用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 *
  3. 它们都位于已添加到LD_LIBRARY_PATH

    的目录中

    但我得到了

    QSqlDatabase: QTDS driver not loaded
    

    修改 我也可以说:

    app.libraryPaths()
    

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

    1. MyappDir / sqldrivers / libqsqltds.so
    2. MyappDir / sqldrivers / libsybdb.so
    3. MyappDir / sqldrivers / libsybdb.so.5
    4. 在dev中,当且仅当此目录在此处时才有效。在Prod中它不适用于任何一种情况。虽然“MyappDir /”始终列在

      app.libraryPaths()
      

1 个答案:

答案 0 :(得分:0)

自我回答:

当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