Qt多工程多目录的编译案例
源地址:http://blog.csdn.net/libaineu2004/article/details/23625441
写这篇文章的目的是为了让Qt像VC++那样,支持一个工程包含多个项目。即1个App+多个动态库。本案例以1个App+1个共享库为例:
工程源码我已上传http://download.csdn.net/detail/libaineu2004/7188655,欢迎下载!
1、在D盘创建空文件夹qMulti
2、使用Qt Creator创建App应用程序:BigWay。注意:创建模板是App,存放路径是D:\qMulti
创建完成后,请关闭当前项目。
3、使用Qt Creator创建共享库项目:SmallBoy。注意:创建模板是C++ lib,存放路径是D:\qMulti
创建完成后,请关闭当前项目。
4、App和Lib创建完成之后,D:\qMulti的情况如下:
我们手动新建一个文本文件D:\qMulti\qMulti.pro,内容如下:
TEMPLATE=subdirs#表示这个是Qt跨目录,由多个子项目(如1个应用程序+多个共享库)组成的大项目
SUBDIRS=SmallBoyBigWay#大项目包含的各个子项目,其中BigWay是应用程序,SmallBoy是共享库
CONFIG+=ordered#CONFIG选项要求各个子项目按顺序编译,子目录的编译顺序在SUBDIRS中指明
到此为止,情况如下:
5、使用Qt Creator打开大项目qMulti.pro,可以看到项目树形结构如下:
(1)原始的BigWay.pro文件是这样的:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T20:18:17
#
#-------------------------------------------------
QT +=coregui
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=BigWay
TEMPLATE=app
SOURCES+=main.cpp\
mainwindow.cpp
HEADERS +=mainwindow.h
FORMS +=mainwindow.ui
我们将其修改为:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T19:02:41
#
#-------------------------------------------------
QT+=coregui#需要的Qt库
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=BigWay#表示编译后的库名字为BigWay
TEMPLATE=app#表示项目是应用程序模式
DESTDIR=../bin#定义项目编译之后生成的结果文件的存放路径
win32{#表示Windows环境的特殊设置,这个大括号不能单独放在下一行,否则编译会报错
LIBS+=../bin/SmallBoy.lib#包含项目需要用到的共享库
}
unix{#表示Linux环境的特殊设置,这个大括号不能单独放在下一行,否则编译会报错
LIBS+=../bin/libSmallBoy.so#包含项目需要用到的共享库,注意文件名多了关键字"lib",扩展名是.so
}
SOURCES+=main.cpp\#项目中的所有源文件的列表
mainwindow.cpp
HEADERS +=mainwindow.h#项目中的所有头文件的列表
FORMS +=mainwindow.ui#项目中的所有.ui文件(由Qt设计器生成)的列表
(2)原始的SmallBoy.pro文件是这样的:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T20:24:55
#
#-------------------------------------------------
QT -=gui
TARGET=SmallBoy
TEMPLATE=lib
DEFINES+=SMALLBOY_LIBRARY
SOURCES+=qsmallboy.cpp
HEADERS+=qsmallboy.h\
smallboy_global.h
unix{
target.path=/usr/lib
INSTALLS+=target
}
我们将其修改为:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T19:04:24
#
#-------------------------------------------------
QT-=gui#不需要Qtui库
TARGET=SmallBoy#表示编译后的库名字为SmallBoy
TEMPLATE=lib#表示项目是共享库模式
DEFINES+=SMALLBOY_LIBRARY#项目所需的额外的预处理程序定义的列表
DESTDIR=../bin#定义项目编译之后生成的结果文件的存放路径
SOURCES+=qsmallboy.cpp#项目中的所有源文件的列表
HEADERS+=qsmallboy.h\#项目中的所有头文件的列表
smallboy_global.h
win32{#表示Windows环境的特殊设置,这个大括号不能单独放在下一行,否则编译会报错
}
unix{#表示Linux环境的特殊设置,这个大括号不能单独放在下一行,否则编译会报错
target.path=/usr/lib
INSTALLS+=target
}
6、Linux环境下使用
如果把完整的项目源码qMulti拷贝到Ubantu Linux下的Qt编译,编译过程一切OK。但是运行时会报错,说“errorwhile loading shared libraries: libSmallBoy.so.1: cannot open shared objectfile: No such file or directory”原因指的是Linux下的共享库路径配置不正确,找不到libSmallBoy.so库文件。默认的linux共享库搜索路径为/lib和/usr/lib两个目录(不包含子目录)。
解决方案有两种:
(1)把编译生成的四个.so文件全部拷贝到文件系统的路径/usr/lib之下,需要管理员权限。
再运行程序,OK。
(2)修改Linux环境变量LD_LIBRARY_PATH,把Qt编程生成的路径加入。
export LD_LIBRARY_PATH=/usr/local/lib
在终端里运行上面这行命令,再运行程序,如果正常就说明解决问题。但是该方法只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在;
7、换一种思路建项目
之前步骤1~4讲的是先建项目再建qMulti.pro文件。其实我们可以采取逆序,先建qMulti.pro文件,后建子项目SmallBoy和BigWay。
我们手动新建一个文本文件D:\qMulti\qMulti.pro,内容如下:
TEMPLATE=subdirs#表示这个是Qt跨目录,由多个子项目(如1个应用程序+多个共享库)组成的大项目
CONFIG+=ordered#CONFIG选项要求各个子项目按顺序编译,子目录的编译顺序在SUBDIRS中指明
或者用Qt Creator新建子目录项目qMulti:
然后用Qt Creator打开这个空的工程。右键菜单,选择“新子项目”,创建即可。(*^__^*)
Qt多工程多目录的编译案例的更多相关文章
- KEIL打开的工程所在目录过深将会编译出错
这是一个工程所在目录过深导致的编译错误
- Qt 5.9.4 如何静态编译和部署?
Qt 5.9.4 如何静态编译和部署? MSVC2015 x86 静态编译 Qt 部署静态库 VS2015 部署静态库 1. MSVC2015 x86 静态编译 1.1 Qt 官网下载最新源代码 立即 ...
- 第5课 Qt Creator工程介绍
1. QT Creator工程管理(一个工程包含不同类型的文件) (1).pro项目文件 (2).pro.user用户配置描述文件 (3).h头文件 (4).cpp源文件 (5).ui界面描述文件 ( ...
- Eclipse中一个Maven工程的目录结构
在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class.以后的日子中也没有机会注意到一个工程到底是怎么组织的这种问题,跟不要说自己 ...
- Makefile 多目录自动编译
适用于多目录结构 C 工程自动编译. makefile 分成三类: 1. 工程根目录 makefile : 这个makefile执行分成两个阶段 a)递归进入每个子目录, 逐个执行子目录里面的 ma ...
- Qt for Windows:Qt 5.4.0 MinGW 静态编译版本制作 (转)
大致流程: 1.安装Qt(源码版)以及其他必要的环境 2.编译/安装 3.配置 4.使用 ----------正文分割线---------- 1.安装Qt(源码版) 1.1 下载Qt(两个地址二选一即 ...
- paip.c++ qt 项目工程互相引用的方法
paip.c++ qt 项目工程互相引用的方法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/ ...
- Eclipse中一个Maven工程的目录结构 (MacOS)
1. 为什么写这篇文章 在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class.以后的日子中也没有机会注意到一个工程到底是怎么组织 ...
- 第一个Maven工程的目录结构和文件内容及联网问题
[第一个Maven工程] ①目录结构 Hello |---src |---|---main |---|---|---java |---|---|---resources |---|---test |- ...
随机推荐
- 2-06. 数列求和(20)(ZJUPAT 数学)
题目链接:http://pat.zju.edu.cn/contests/ds/2-06 给定某数字A(1<=A<=9)以及非负整数N(0<=N<=100000).求数列之和S ...
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- keytool 生成 Android SSL 使用的 BKS
我是在Mac(JDK 1.6) 环境下生成的,Windows 也应该通用; 首先要从CA那里申请来签名的证书,我的是crt格式的; 然后使用如下命令,对应的BcProvider 是 bcprov-e ...
- 树莓派常用Linux命令
转自小五义 1.ls命令:列出文件目录的常用命令,主要参数见下表. -a 列出目录下的所有文件,包括以.开头的隐含文件. -b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列 ...
- HDU 3917 最大权闭合图 求最小割
具体参考http://blog.csdn.net/power721/article/details/6665750 TODO //#pragma comment(linker, "/STAC ...
- Codeforces 489C Given Length and Sum of Digits...
m位长度,S为各位的和 利用贪心的思想逐位判断过去即可 详细的注释已经在代码里啦~ //#pragma comment(linker, "/STACK:16777216") //f ...
- iOS8的屏幕旋转的问题
判断横竖屏.http://www.cocoachina.com/ask/questions/show/121301 //self.cameraView是相机view - (NSUInteger)sup ...
- php函数参数
函数的参数 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表.参数是从左向右求值的. PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数.也支持可变长度参数列表,更多信息参见 ...
- SQL语言类
SQL语分为四类:数据查询语言DQL,数据操纵语言DML. 数据定义语言DDL,数据控制语言DCL. 1 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句.FROM子句,WHE ...
- BZOJ 1260: [CQOI2007]涂色paint( 区间dp )
区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...