qt creator源码全方面分析(3-5)
codeForFamily 人气:3
[TOC]
# qtcreatorlibrary.pri
上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件都介绍一遍。首先为qtcreatorlibrary.pri。
## 使用实例
为了分析这个文件,我们找个使用该pri的例子,源目录\src\libs\cplusplus\cplusplus.pro
```
DEFINES += NDEBUG
unix:QMAKE_CXXFLAGS_DEBUG += -O2
win32:QMAKE_CXXFLAGS_DEBUG += -O2
include(../../qtcreatorlibrary.pri)
include(cplusplus-lib.pri)
```
以及依赖项,源目录\src\libs\cplusplus\cplusplus_dependencies.pri
```
QTC_LIB_NAME = CPlusPlus
QTC_LIB_DEPENDS += \
utils
INCLUDEPATH *= $$IDE_SOURCE_TREE/src/libs/3rdparty
```
这里我们可以看见,设置了库名QTC_LIB_NAME和依赖的库名QTC_LIB_DEPENDS,这在qtcreator.pri中解析依赖时会用到的。
## 上半部
下面,我们来分析qtcreatorlibrary.pri,这里分为两部分来介绍。
上半部分如下
```
include($$replace(_PRO_FILE_PWD_, ([^/]+$), \\1/\\1_dependencies.pri))
TARGET = $$QTC_LIB_NAME
include(../qtcreator.pri)
# use precompiled header for libraries by default
isEmpty(PRECOMPILED_HEADER):PRECOMPILED_HEADER = $$PWD/shared/qtcreator_pch.h
win32 {
DLLDESTDIR = $$IDE_APP_PATH
}
DESTDIR = $$IDE_LIBRARY_PATH
```
[DLLDESTDIR](https:/https://img.qb5200.com/download-x/doc.qt.io/qt-5/qmake-variable-reference.html#dlldestdir)
>注意:此变量仅适用于Windows目标。
>
>指定要将目标dll复制到的位置。
[DESTDIR](https:/https://img.qb5200.com/download-x/doc.qt.io/qt-5/qmake-variable-reference.html#destdir)
>指定放置目标文件的位置。
>
>例如:
>
>```
>DESTDIR = ../../lib
>```
>
>注意:支持的字符列表可能取决于所使用的构建工具。 特别是,括号不适用于make工具。
1. 根据pro文件名获取对应的依赖文件,进行包含。
\_PRO_FILE_PWD_为包含该pri的pro所在的文件夹路径,(\[^/\]+$)表示路径中最后一个分隔符后面的字符串,\\1为反向引用,代表所获取的第1个匹配的引用。
示例:\_PRO_FILE_PWD_为源目录/src/libs/cplusplus,包含文件为源目录/src/libs/cplusplus/cplusplus_dependencies.pri,匹配项为cplusplus。
2. 设置库文件名。
示例:CPlusPlus。
3. 加载qtcreator.pri。
具体内容见往期文章[qt creator源码全方面分析(3-2)](https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-2.html)。
这里重点提示下,第一步加载的依赖文件中,设置了QTC_LIB_DEPENDS,那么在qtcreator.pri会进行依赖解析(utils库),并进行包含。
4. 添加预编译头文件。
示例:源目录/src/shared/qtcreator_pch.h。内容就是一些常用的统一的Qt头文件。
5. 设置DLL目标文件夹。
如果win32平台,且生成的目标是dll,则把该dll拷贝到IDE_APP_PATH中,即构建目录/bin。
6. 设置目标文件夹。
把生成的目标,输出到IDE_LIBRARY_PATH,即构建目录/lib/qtcreator。
## 下半部
下半部分如下
```
osx {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/Frameworks/
QMAKE_LFLAGS += -compatibility_version $$QTCREATOR_COMPAT_VERSION
}
include(rpath.pri)
TARGET = $$qtLibraryTargetName($$TARGET)
TEMPLATE = lib
CONFIG += shared dll
contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
win32 {
dlltarget.path = $$INSTALL_BIN_PATH
INSTALLS += dlltarget
} else {
target.path = $$INSTALL_LIBRARY_PATH
INSTALLS += target
}
```
1. osx设置和rpath.pri,设置编译选项,略。
2. 设定输出目标的文件名。
这里调用了qtcreator.pri中定义的qtLibraryTargetName()函数,其实就是在debug模式下添加字符d,以区分release模式。函数分析见[qt creator源码全方面分析(3-2)](https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-2.html)。
3. 设定输出类型,为共享lib库。
4. 设置隐藏导出符号选项。
5. 设置安装路径。
## 结果
在构建目录中,我们在DLLDESTDIR和DESTDIR指定的两处地方找到了编译得到的库。
我们在cplusplus.pro包含qtcreatorlibrary.pri,在pri中加载cplusplus_dependencies.pri,然后加载qtcreator.pri,并在其中解决依赖,最终加载utils_dependencies.pri,项目目录架构结果如下。
------
**`原创造福大家,共享改变世界`**
**`献出一片爱心,温暖作者心灵`**
------
加载全部内容