1

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

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

  1. -rwxr-xr-x 1 foxprd foxprd 47880 Jan 29 17:33 libqsqltds.so*
  2. -rwxr-xr-x 1 foxprd foxprd 472579 Jan 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()
4

1 回答 1

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
于 2014-02-07T18:39:51.223 回答