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同一目录。