2016-10-10 102 views
0

讓我們來談談它在linux的條款。我有一個「.so」文件。我想使可執行文件依賴於它,在同一個目錄中查找它。你如何通過q​​make做到這一點?或者這隻能通過使用QLibrary來實現?你可以指定在qmake中執行的路徑嗎?

例如,當你有一個「所以」文件,並希望在項目中使用它,在QMAKE你寫:

LIBS += -L"path to the folder that contains your .so" -lSoName 

但路徑是硬編碼的,你可以看到,我想知道在那裏寫什麼來使可執行文件在同一個目錄中查找「.so」。

+0

你想你的。所以在同一目錄中找到ectory在運行時還是編譯時? – PnotNP

+0

@NulledPointer運行時。 – Pavel

回答

1

有幾種方法可以做到這一點。

如果可執行文件正在當前目錄中,那麼執行LIBS += -L$$(PWD) -lSoName

如果你把可執行文件到其他一些子目錄,一些qmake變量像DESTDIR規定,使用LIBS += -L$$(DESTDIR)(或任何變量保存目錄)。

或者,您可以將包含可執行文件的目錄添加到可執行文件的運行時路徑中,從而爲動態鏈接程序提供一個目錄列表,以在運行時搜索任何未解析的庫。這可以通過QMAKE_RPATHDIR += -L$$(PWD)LIBS += -lSoName完成,它會告訴鏈接程序在運行qmake的當前目錄中查找未解析的庫。

默認情況下,某些操作系統還可能在庫的運行時搜索路徑中包含當前目錄,在這種情況下,只需執行LIBS += -lSoName就足夠了。儘管如此,這是依賴於平臺的,而上述解決方案則不是。

+0

我在談論可執行文件的目錄,而不是qmake的目錄。使用QLibrary在運行時,我可以獲得可執行文件的路徑並從同一目錄加載.so,但我想知道是否可以通過qmake完成。 – Pavel

+1

@Pavel鏈接共享庫總是必須位於可執行文件旁或全局路徑中。給qmake的路徑只是爲了鏈接,而不是爲了執行。在執行期間,共享庫將始終在同一個目錄和全局路徑(win)或全局lib路徑(lin)中查找(默認行爲) –

+0

@SebastianLange非常感謝!我只是從qt方面學到了這些東西,但不是以g ++的方式,所以我不知道幕後究竟發生了什麼。現在你解釋了。 – Pavel

2

您使用RPATH

您可以配置二進制或庫使用在二進制本身,其裝載尊重在運行時emedded RPATH指令來尋找當前目錄下的共享庫(或DLL)

1添加以下在.pro文件

unix { 
     message("Adding RPATH to the app") 
     QMAKE_LFLAGS += -Wl,-rpath=\'\$$ORIGIN/\' 
     QMAKE_RPATH  = 
} 

這將設置可執行RPATH到當前目錄和你的可執行文件將首先嚐試尋找那些.so在當前目錄,然後在標準目錄(此過程解釋here

2-後您編譯和創建二進制確認RPATH設置正確

objdump -x <path/to/binary> |grep RPATH 

它應該說$ORIGIN

編譯時間的配置:

CXXFLAGS += -L"/path/to/libmarylin.so/file" -lmarylin 
+0

「LIBS + =」呢?那條線上有什麼?我只寫了「-lSoName」,它不起作用。 – Pavel

+0

離開這條線,像你指定,並嘗試我的建議。順便說一句,如果你的庫通常被命名爲「libmarylin.so」,那麼你應該說「-lmarylin」(刪除「lib」部分) – PnotNP

+0

我剛剛做了,它不起作用。找不到「.so」。這對你有用嗎? – Pavel

相關問題