在开发一个软件项目时候,当涉及到一个模块,已经有过类似的项目开发,为了避免重复开发,涉及到在该项目的工程中调用已开发的项目作为子项目,有很多种方法。
一、将项目编译成库文件然后进行调用
调用库文件通常有两种调用方法,一种是内部调用,一种是外部调用。两者的区别不大,也就是
1.内部调用
用到TEMPLATE与SUBDIRS,只是这样就还需要一个大框架C来包含A和B,并不好用。
TEMPLATE = subdirs
SUBDIRS += \
A \
B
2.外部调用
1) 方法1
项目A中调用项目B 的大致流程如下:
- 将项目B生成动态或者静态库,编译动态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译动态库,编译静态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译静态库;
- 将B的库文件和B所有的头文件一起放到项目A的工程目录下的同个目录中。(当然,也可以放到写入环境变量的目录下,只是个人感觉没必要);
- 通过外部库调用,引用库文件,使用"add Existing Directory"导入头文件。使用库文件的方法可以参考撮合Qt的mingw编译器与snmp++3.4.6之库文件使用。
1) 方法2
还有一种方法,可以用到Qt的宏定义,项目A中调用项目B 的大致流程如下:
- 在项目B的pro文件中修改,
,意我编译为库文件;TEMPLATE = lib
- 在B的pro文件中添加,
,意为导出库文件,可参考Qt文档阅读笔记-共享库的创建与调用;DEFINES += TEXT_LIBRARY
- 添加或者修改xxx_global.h文件,与第二步中的DEFINES内容对应起来,具体参考Qt文档阅读笔记-共享库的创建与调用;
- 修改B的类文件的内容,类名前加上第二步中DEFINES的内容,参考QT生成带界面的动态库并使用;
二、将项目编译成库文件然后进行调用
1.直接导入调用
项目A调用项目B,进行讲解。
直接将项目B的文件整个放入A中,然后通过"add Existing Directory",将B放入A中。只是这样的话,相当于将工程B的pro文件的内容,都写入A的pro文件中,这样A的工程文件会比较混乱,不利于使用。
2.使用pri文件调用
在项目B中创建一个pri文件,然后在A中调用B的pri文件,pri文件中的内容大致就是B的pro文件中的内容。这样使用起来会比较整齐。
例如B的pro文件的内容如下:
#-------------------------------------------------
#
# Project created by QtCreator 2019-01-22T17:29:55
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ADataAnsys
TEMPLATE = app
SOURCES +=\
widget.cpp \
paintarea.cpp \
globaldata.cpp \
playthread.cpp \
dataansys.cpp
HEADERS += widget.h \
paintarea.h \
globaldata.h \
playthread.h \
dataansys.h
FORMS += widget.ui
则pri文件的内容可以这么写
SOURCES +=\
$$PWD/widget.cpp \
$$PWD/paintarea.cpp \
$$PWD/globaldata.cpp \
$$PWD/playthread.cpp \
$$PWD/dataansys.cpp
HEADERS += $$PWD/widget.h \
$$PWD/paintarea.h \
$$PWD/globaldata.h \
$$PWD/playthread.h \
$$PWD/dataansys.h \
FORMS += $$PWD/widget.ui
因为这两行内容
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
在A的pro文件中有写,因此可以不写。
这两行内容
TARGET = ADataAnsys
TEMPLATE = app
因为B和A一起编译,因此不能写。都使用A的内容。
pri文件启示是pro文件的补充。可参考
三、结论
将项目编译成库文件然后进行调用,这样也有弊端,在跨平台时可能会比较麻烦,需要重新编译新的库。因此,笔者更喜欢用第二种方法,直接将要被调用的项目生成一个pri文件,放入调用的工程文件中,一起编译。