我有一个使用QTDS驱动程序的程序。
在开发环境中一切正常。 在生产中,我有TDS插件和sybdb可用的适当权利。
它们都位于已添加到LD_LIBRARY_PATH
的目录中但我得到了
QSqlDatabase: QTDS driver not loaded
修改 我也可以说:
app.libraryPaths()
指向一个目录,其中有一个包含所有lib的sqldrivers /目录 如果我在开发中重命名这个目标,我会得到同样的错误,如果我把它放回去再次有效。
在dev中,当且仅当此目录在此处时才有效。在Prod中它不适用于任何一种情况。虽然“MyappDir /”始终列在
中app.libraryPaths()
答案 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