2010-03-23 110 views
10

我想包括libQtGui.so.4 libQtNetwork.so.4和libQtCore.so.4在我的應用程序所在的同一目錄中。我如何讓Qt理解這一點? y的目的是使用共享庫的獨立應用程序如何設置Qt應用程序找到Qt模塊的位置?

+0

你也可以決定靜態鏈接到Qt庫,這樣你就不會依賴於本地安裝的Qt版本(這是Opera在Linux下如何使用它) – sisis 2010-03-23 02:34:33

+0

在平臺上靜態鏈接的問題我是部署on是fontconfig被竊聽(紅帽5.3使用fontconfig 2.4.1) – 2010-03-23 02:57:29

+0

當我嘗試靜態構建時,有一個未定義的引用FcTypeFreeQueryFace,當我嘗試更新fontconfig時,它告訴我fontconfig是最新的... ..bummer ..然後我必須找到一種方法來修改Qt文件,以使用我提供的fontconfig版本進行構建。我能夠使用我提供的fontconfig動態構建我的應用程序,但不是靜態的 – 2010-03-23 02:58:56

回答

8

設置LD_LIBRARY_PATH環境變量是一個選項。例如:

export LD_LIBRARY_PATH=/path/to/dir/with/libs:$LD_LIBRARY_PATH 

另一種選擇是在鏈接期間設置Qt應用程序的RPATH。將RPATH設置爲「$ ORIGIN」值將導致動態鏈接程序在運行時查找與Qt應用程序相同的目錄。例如,如果使用QMAKE,添加以下代碼片段到你的項目文件:

unix:!mac{ 
    QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN 
    QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/lib 
    QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/libs 
    QMAKE_RPATH= 
} 

這將設置RPATH爲「$ ORIGIN:$ ORIGIN/lib目錄下:$ ORIGIN /庫」,這意味着動態鏈接器會首先查看Qt應用程序的位置,然後查看其位置的lib子目錄,然後查看其位置的libs子目錄,最後查看任何系統定義的位置。

+0

似乎沒有工作。 – 2010-03-23 16:33:34

+0

這裏是編譯輸出:「g ++:unrecognized option'-wl, - rpath = $ ORIGIN'」「g ++:無法識別的選項'-wl, - rpath = $ ORIGIN/lib'」「g ++:無法識別的選項' - wl, - rpath = $ ORIGIN/libs'「 – 2010-03-23 16:38:26

+0

直接在Makefile中手動刪除這些內容,再次按下構建所有內容,然後通過...現在試用它。 – 2010-03-23 17:18:02

0

在查看系統標準庫之前,UNIX/Linux將首先查找LD_LIBRARY_PATH(如果已設置)。所以如果你設定了,你確實可以覆蓋。就像在Windows上設置PATH一樣。同樣的效果。訂購很重要。

您可以添加./或。到LD_LIBRARY_PATH。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 
+0

我試過了,它不起作用。我進入項目並將LD_LIBRARY_PATH更改爲。但是當我回到終端並輸入ldd ./MyApp時,沒有任何變化...我正在從GUI構建...我應該從命令行嘗試嗎? – 2010-03-23 02:51:43

0

LD_LIBRARY_PATHQMAKE_RPATH從來沒有爲我工作。相反,我在我的.pro文件中設置了QMAKE_RPATHDIR。例如,在構建並安裝(make install)Qt之後,它已被放置在/usr/local/Trolltech/Qt-4.8.5/lib/中。然後,我寫我的.pro文件中的以下內容:

QMAKE_RPATHDIR += /usr/local/Trolltech/Qt-4.8.5/lib/ 

注1:使用相對路徑似乎並沒有工作。偏好絕對路徑。

注2:當你再make,你可以看到下面的選項被傳給連接器:-Wl,-rpath,/usr/local/Trolltech/Qt-4.8.5/lib/

注3:爲確保動態二進制鏈接到正確的庫,可以顯示在運行時通過qVersion()提供的Qt版本。