2014-02-07 88 views
1

我有一個使用QTDS驅動程序的程序。QSqlDatabase:QTDS驅動程序未加載

在開發環境中一切正常。 在生產中,我同時擁有TDS插件和sybdb以及相應的權限。

  1. -rwxr-XR-X 1個foxprd foxprd 47880 01月29日17時33分libqsqltds.so *
  2. -rwxr-XR-X 1個foxprd foxprd 472579 01月29日17時33分libsybdb.so *

他們都是一個目錄中已添加到LD_LIBRARY_PATH

,但我得到了

QSqlDatabase: QTDS driver not loaded 

編輯 我ASLO可以告訴大家:

app.libraryPaths() 

點,其中有一個包含所有的庫 如果我重新命名在開發這個direcotry我得到同樣的錯誤,如果我把一個sqldrivers /目錄的目錄它又回到了它的工作。

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

在開發它的工作原理,當且僅當此目錄在這裏。在Prod中,無論在哪種情況下都不起作用。雖然「MyappDir /」始終在

app.libraryPaths() 

回答

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