(193条消息) 浅谈 qmake 之 pro、pri、prf、prl文件_1+1=10-CSDN博客_pri文件
(193条消息) QT中的.pro文件,以及.pri .prj .prl文件说明_zjc0230的专栏-CSDN博客
Qt pro配置文件备忘 - ike_li - 博客园 (cnblogs.com)
(194条消息) Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文档_$firecat全宏的代码足迹$-CSDN博客
qt中的 $$PWD
$$PWD返回的是当前文件所在的路径
OUT_PWD
表示输出的“Makefile”所在的路径(通常在编译后生成的.exe文件的上层目录里)。
LIBS += -L$$OUT_PWD/../funDll/ -lfunDll
.pro
qmake 的工程(project)文件
QT .pro的一些通用配置
#设置UI文件目录
UI_DIR = ./ui
CONFIG(debug, debug|release)
{ #设置debug配置下编译生成文件的路径
TARGET = $$join(TARGET,,,d) #为debug版本生成的文件增加d的后缀
contains(TEMPLATE, "lib")
{
DESTDIR = ../output/debug/lib #将库放在lib文件夹下
DLLDESTDIR = ../output/debug/bin #将动态库自动拷贝至bin目录下
}
else
{
DESTDIR = ../output/debug/bin #将应用程序放在bin目录下
}
OBJECTS_DIR = ./debug/obj #将生成的对象文件放在专门的obj文件夹下
MOC_DIR = ./debug/moc #将QT自动生成的对象放在moc文件夹下
}
else
{ #设置release配置下编译生成文件的路径
contains(TEMPLATE, "lib")
{
DESTDIR = ../output/release/lib #将库放在lib文件夹下
DLLDESTDIR = ../output/release/bin #将动态库自动拷贝至bin目录下
} else
{
DESTDIR = ../output/release/bin #将应用程序放在bin目录下
}
OBJECTS_DIR = ./release/obj #将生成的对象文件放在专门的obj文件夹下
MOC_DIR = ./release/moc #将QT自动生成的对象放在moc文件夹下
}
.pro文件中LIBS用法详细讲解
用法:LIBS += -Lzzz -lxxx -lyyy
zzz:库路径
xxx、yyy:库文件
库路径可以有以下的形式:
-L. 表示 .pro所在目录
-L$$_PRO_FILE_PWD_/ 表示 .pro所在目录
-L$$PWD/ 表示 .pro所在目录
-LC:/abc/ 表示C:/abc/
库文件可以有以下的形式:
若.pro所在目录lib下有解码库需要被链接,msvc版本为“VideoDecoder.lib”,mingw版本为“libVideoDecoder.a”。
(1)不加-L时,需要写库文件全名:
LIBS += -L$$PWD/lib VideoDecoder.lib
或
LIBS += -L$$PWD/lib libVideoDecoder.a
这样写死,不利于多编译器编译,不推荐。
(2)加-l时,可以将不同编译器库文件名差异屏蔽掉
假设链接msvc库,则只需要去掉文件后缀(一般是.lib):
LIBS += -L$$PWD/lib -lVideoDecoder
假设链接mingw/gcc库,则需要去掉文件前缀"lib",和后缀(一般是.a):
LIBS += -L$$PWD/lib -lVideoDecoder
这样不管在哪个编译器下,都能保证命令一致。
注意:
请牢记msvc库只去后缀,mingw库去前缀和后缀。
因为我遇到一个问题,使用msvc编译工程,工程中调用了boost线程库,boost使用msvc编译为静态库,这个静态线程库
的名字比较坑“libboost_thread-vc141-mt-gd-x64-1_71.lib”,按照我们一贯的想法,肯定是去掉前lib,去掉后缀.lib,像这样:
LIBS += -LC:/Boost_msvc_static/lib/ -lboost_thread-vc141-mt-gd-x64-1_71
死活编译不过,找不到库文件。此时,你只要想起来链接msvc库只去后缀,像这样:
LIBS += -LC:/Boost_msvc_static/lib/ -llibboost_thread-vc141-mt-gd-x64-1_71
编译就通过了。
附《msvc、mingw分别编译动态库与静态库文件名区别》:
msvc动态库:test.dll,test.lib
msvc静态库:test.lib
mingw动态库:test.dll、libtest.a
mingw静态库:libtest.a
链接库 -L -l -I -i的作用及区别
-L
指定库文件目录,可以指定多个文件目录。库目录没有在/lib、/usr/lib、/usr/local/lib中,则必须用-L来指定一个库目录
-l(小写L)
指定具体的库文件。如果没有指定,则默认去/lib、/usr/lib、/usr/local/lib去找。默认寻找的是动态库,可以指定-static,寻找静态库。
-I(大写i)
指定头文件目录
所以,如果是我们想用一个任意文件夹下的库文件,一般做法就是
gcc xxx.c -o a.out -L 库目录 -l(小写L) 具体的库文件名 -l(大写i) 库的头文件