源地址: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. 仿知乎安卓client滑动删除撤销ListView

    标签(空格分隔): Android 新版的知乎安卓client有一个有趣的功能,就是在一个item里.向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了.放开手指就是删除.删除后还 ...

  2. levelDB跳表实现

    跳表的原理就是利用随机性建立索引,加速搜索,并且简化代码实现难度.具体的跳表原理不再赘述,主要是看了levelDB有一些实现细节的东西,凸显自己写的实现不足之处. 去除冗余的key template& ...

  3. 使用Git上传代码到GitHub详细的不能再详细教程

    据说不会用GitHub的程序员连菜鸟都不算,确实,GitHub上有大量优秀的代码,我们也可以将自己的代码分享上去. 首先,你要有一个GitHub的账号,https://github.com/在官网注册 ...

  4. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  5. 如何用 new 来动态开辟一个二维数组

    一般的做法是: int **p = new int*[m]; //m行n列型 for (i = 0; i < m; ++i) { p[i] = new int[n]; for (j = 0; j ...

  6. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

  7. iOS开发UITableViewCell的选中时的颜色设置

    1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...

  8. js Function 加不加new 详解

    以下来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new The new operato ...

  9. 基于visual Studio2013解决C语言竞赛题之0603打印素数

     题目

  10. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...