Qt中pro檔案如何從相對路徑導入庫
Qt工程中有lib、dll、a、so等檔案需要導入時,有時需要指定路徑。指定絕對路徑換到其他機器編譯時會不大友善。那麼,如何在Qt pro檔案中通過相對路徑導入庫呢。
動态庫添加方式與靜态庫添加方式是不同的。實際使用過程中需要加以差別。
動态庫添加代碼
LIBS += -L ./ \
-L ./libpath/ \
-L $$PWD/libpath/path/ \
-l mylib \
-l mylib2
LIBS+= "d:/programfiles/mylib3.a"
LIBS+="$$PWD/path/to/lib/mylib4.a"
LIBS+="./path/to/lib/mylib5.a"
以上文法在Qt5.9中全部可行。
在Qt5.2中,第3行方式($$PWD)編譯會報錯,說是無權通路檔案夾。
靜态庫添加代碼
LIBS += mylib.a \
./path/mylib2.a
LIBS+= "d:/programfiles/mylib3.a"
LIBS+= "$$PWD/path/to/lib/mylib4.a"
LIBS+="./path/to/lib/mylib5.a"
看出來了吧,靜态庫添加時不要加-l字首。或者直接用雙引号以檔案的方式加載。靜态庫必須寫全路徑。所有-L添加的路徑都隻針對動态庫有效。
含義:
1) 上面的代碼表示将目前路徑、./libpath、./libpath/path/目錄加入庫檔案搜尋目錄中,并向工程添加mylib、mylib2、mylib3、mylib4、mylib5這幾個庫檔案。
2) 路徑中有空格時,用雙引号括起來。加上庫的字尾使用全名。不要先導符号-l或者-L。
文法解析:
-L表示後面跟的是一個檔案夾,工程會将這個目錄加入庫檔案搜尋路徑中。
-l表示後面跟的是一個庫檔案的名字。不論字尾是.lib、.dll、.so、.a,都不需要加上字尾名,直接用庫的點分号前面部分名字即可。
用于含空格的路徑,由于可能含空格,是以引号的模式不能加任何-l或者-L字首,隻能是庫檔案全部路徑,也即一定要帶上字尾。為啥呢?個人感覺是避免make檔案意外注入。。。意外被空格分隔成多條指令。。。。引号内可以使用變量,$$PWD之類的,也可以用“.”号。
注意事項
如果是在Qt中F5來Debug運作,確定庫檔案在Debug目錄下對應的目錄中。
如果已經編譯過,直接從exe打開檔案進行執行,隻要庫檔案在exe相同目錄下即可。
在庫檔案名字前面不要加任何路徑。因為不加路徑,工程會自動從所有包含路徑中去查找,而如果包含了路徑,那就會從指定路徑下去尋找(萬一在某個包含的路徑中有庫檔案但自己手欠寫成另外一個不包含庫檔案的目錄)。顯然不加路徑限定更加靈活。
注意$$PWD與.的差別。$$PWD直接取出了代碼所在目錄,是以是固定的。當使用.号時,makefile檔案中解析後還是一個.号,是以建構時代表與makefile同一目錄。