源地址: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多工程多目录的编译案例的更多相关文章

  1. KEIL打开的工程所在目录过深将会编译出错

    这是一个工程所在目录过深导致的编译错误

  2. Qt 5.9.4 如何静态编译和部署?

    Qt 5.9.4 如何静态编译和部署? MSVC2015 x86 静态编译 Qt 部署静态库 VS2015 部署静态库 1. MSVC2015 x86 静态编译 1.1 Qt 官网下载最新源代码 立即 ...

  3. 第5课 Qt Creator工程介绍

    1. QT Creator工程管理(一个工程包含不同类型的文件) (1).pro项目文件 (2).pro.user用户配置描述文件 (3).h头文件 (4).cpp源文件 (5).ui界面描述文件 ( ...

  4. Eclipse中一个Maven工程的目录结构

    在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class.以后的日子中也没有机会注意到一个工程到底是怎么组织的这种问题,跟不要说自己 ...

  5. Makefile 多目录自动编译

    适用于多目录结构 C 工程自动编译. makefile 分成三类: 1. 工程根目录 makefile  : 这个makefile执行分成两个阶段 a)递归进入每个子目录, 逐个执行子目录里面的 ma ...

  6. Qt for Windows:Qt 5.4.0 MinGW 静态编译版本制作 (转)

    大致流程: 1.安装Qt(源码版)以及其他必要的环境 2.编译/安装 3.配置 4.使用 ----------正文分割线---------- 1.安装Qt(源码版) 1.1 下载Qt(两个地址二选一即 ...

  7. paip.c++ qt 项目工程互相引用的方法

    paip.c++ qt 项目工程互相引用的方法 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/ ...

  8. Eclipse中一个Maven工程的目录结构 (MacOS)

    1. 为什么写这篇文章 在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class.以后的日子中也没有机会注意到一个工程到底是怎么组织 ...

  9. 第一个Maven工程的目录结构和文件内容及联网问题

    [第一个Maven工程] ①目录结构 Hello |---src |---|---main |---|---|---java |---|---|---resources |---|---test |- ...

随机推荐

  1. 第二种:NSObject

    - (void)viewDidLoad { [super viewDidLoad]; /** * 开启子线程的方式之一:NSObject */ // 第一个参数:selector // 第二个参数:方 ...

  2. Hibernate级联操作和载入机制(二) cascade and fetch

    上一篇介绍了Hibernate持久化对象时候的级联操作.本篇介绍读取时候的级联操作. 还是用上一篇的样例.一份问卷有多个问题.可是每一个问题仅仅能属于一份问卷. 我们先看測试用例: @Test pub ...

  3. Unity KillCount

    using UnityEngine; using System.Collections; public class KillCountMult : MonoBehaviour { public GUI ...

  4. Vmware ESX 5.0 安装与部署

    近期我公司部署了虚拟化,採购了两台Dell R710的server(CPU:64位双核,主频:2.4GHZ, 32G 内存.硬盘:2块300G做Riad 1.3块2T做Riad 5 .10块网卡),在 ...

  5. 自定义UISlider的样式和滑块

    又做完一个项目,遂到了写帖时间了,要跟大家分享的是:自定义UISlider的图片和滑块,先看一下效果: 然后是实现了,我们使用的是UISlider的setMinimumTrackImage,和setM ...

  6. ZOJ3640-Help Me Escape

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...

  7. bootstrap框架开发电子商城案例

    bootstrap框架开发电子商城案例 玛图 bootstrap 商城框架

  8. 2014-7 Andrew Ng 自动化所报告听后感

    原文:http://blog.sina.com.cn/s/blog_593af2a70102uwhl.html 一早出发,8点20就赶到现场, 人越聚越多,Ng提前几分钟到达现场,掌声一片.    N ...

  9. BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )

    n <= 105 , 其实是10 ^ 5 ....坑...我一开始写了个模拟结果就 RE 了.. 发现这个后写了个单调栈就 A 了... ---------------------------- ...

  10. MessageBox不能前置显示的问题

    在MFC的开发中,经常会遇到一些莫名奇妙的问题,可能是经验不足的原因吧. 进入正题....在手头的项目中,用MFC做的界面应用.在某一天突然发现程序界面不能进行响应,经过反复的调试后发现:Messag ...