找回密码
 立即注册

多项目开发编译问题

发表于 2018-4-13 16:45:11 | 显示全部楼层 |阅读模式
20Qter豆
本帖最后由 funny265 于 2018-4-13 16:52 编辑

刚刚学习QT没有多久,因开发需要想将手头的一个项目改为QT开发,因项目涉及功能较多,所以想将项目拆分成多个子项目进行开发,于是将项目分成如下结构:
project ------- 总项目(subdirs)
   ui ------- 界面(Qt Widgets Application 子项目)
        main ------- 主界面(pri 项目)
        login ------- 登录界面(pri 项目)等
   lib -------- 功能 (subdirs 子项目)
       common ------- 通用模块 (pro 子项目 - 动态库)
       util ------- 工具模块(pro 子项目 - 动态库)等
   bin ------- 输出目录(项目编译后文件输出目录)
       debug ------- debug版目录
       release ------- release版目录

使用的开发环境是QT 5.9.2 MSVC 2015 32bit

现遇到的问题如下:
1. pro文件命令的详细说明
官方有些命令也是一句话带过,对于我这种刚刚接触QT和qmake的人完全一头雾水。网上能找到的说明也都是一些最常用基本的说明,对于一些例如QMAKE_POST_LINK、target.pathDEPENDPATH的用法说明基本都是一句话带过,想问哪里可以找到一个相对比较完整详细介绍qmake用法的文章或者文档,对于我这种QT新手能够更好的理解和掌握的资料,比如一些常量的说明$$PWD表示当前项目所在路径等。

2.使用隐式调用第三方库问题
网上找到的隐式调用第三方库只能在项目所在目录也就是.pro所在的目录调用,而我希望能够在.exe所在目录调用所以将:INCLUDEPATH += $$PWD/tp/include/Vt_eng
LIBS += $$PWD/tp/lib/Vt_eng/vt_eng.lib
修改为:
INCLUDEPATH += -Ltp/include/Vt_eng
LIBS += -Ltp/lib/Vt_eng/ -lvt_eng

include中存放的是vt_eng的.h头文件lib中存放的是vt_eng的lib和dll文件

目前的问题是在单独的Qt Widgets Application项目中将文件拷贝到release下的.exe所在目录,使用QT Creator运行没有问题,但直接点击.exe会提示找不到相应.dll。而将文件拷贝到实际开发项目的也就是上面结构的bin/debug目录后,在QT Creator下编译提示找不到.h头文件。

3.lib功能代码如何编译后提供给界面项目隐式调用
因为想使用隐式调用,但对于如何在编译时将.h头文件编译到项目输出目录完全没有头绪,总不能每次编译好以后都将.h头文件拷贝到相应的文件夹里吧?那样的话子项目的意义何在?网上找了一堆关于多子项目开发的帖子和文章,一部分是使用的QT 4.x版本,跟我使用的版本有区别;另一部分是几句话带过,对于pro文件中的编译命令的用法没有详细的说明。这里想知道如何设置.pro文件才能将自己创建的动态库项目自动编译到可运行的目录中去,比如Debug和Release目录的设置。

刚刚接触QT所以问题较多,网上的大部分教程都是在说明项目如何搭建以及单独控件如何使用,不知道有没有对于实际大型复杂项目开发的案例教程之类的,有的话希望大神能给推荐一二。




回复

使用道具 举报

发表于 2018-4-13 20:39:21 | 显示全部楼层
1. 这个目前最详细的应该还是官方文档,其它通常只能对着具体的问题去搜答案。还有一种学习的方法是去看成熟的大型qt项目的源码,比如Qt CreatorqBittorrent,甚至是Qt自身。顺便豆子大神有在写Qt Creator 源码学习的系列,虽然才开头,但也能学到不少东西。
2. 其实这个问题我没太看懂。正常来说,在windows下,包含exe的目录是进行动态库最优先被搜索。而且你的项目结构看起来也怪怪的,由于qmake一般使用shadow builds,项目目录不会包含它的输出目录。
至于第三方库,我建议是他们全部放在项目目录,再将需要的文件在构建的时候拷贝到输出目录。
下面是我常用的一个自动拷贝文件的方法:
  1. FILES_TO_COPY = # should be absolute path or use $absolute_path()

  2. for(FILE, FILES_TO_COPY) {
  3.     DDIR = $shadowed($FILE)
  4.     QMAKE_POST_LINK += $QMAKE_COPY $quote($shell_path($FILE)) \
  5.          $quote($shell_path($DDIR)) $escape_expand(\\n\\t)
  6.     QMAKE_CLEAN += $shell_path($DDIR)
  7. }
复制代码

3. 我不明白为什么需要将头文件拷贝到输出目录。如果确实需要,用上面的方法应该也可以。
回复

使用道具 举报

发表于 2018-4-16 09:10:09 | 显示全部楼层
其他的我也不是很清楚,但是那个拷贝到 .exe 运行问题很大可能就是你的 Qt 的环境变量没有配置好导致的,看看这个的第三步:
https://my.oschina.net/CgShare/blog/182981
回复

使用道具 举报

 楼主| 发表于 2018-4-16 09:51:44 | 显示全部楼层
本帖最后由 funny265 于 2018-4-16 10:12 编辑
miroox 发表于 2018-4-13 20:39
1. 这个目前最详细的应该还是官方文档,其它通常只能对着具体的问题去搜答案。还有一种学习的方法是去看成 ...

问题2的意思是,,单独建一个QT application项目,,不使用多级目录,,按INCLUDEPATH += -Ltp/include/Vt_eng   LIBS += -Ltp/lib/Vt_eng/ -lvt_eng 设置好引用,,将dll lib .h拷贝到项目输出目录,,运行exe会提示找不到dll;而按照我写的项目分包创建项目之后,,将三个文件拷贝到项目输出目录,,构建时就会提示找不到.h文件。应该是我的引用设置的不对,,但是哪里有问题我又不知道从哪里开始找,,没有规范文档,,官方有的地方也是一句话带过。
问题3主要是为了不一次次的拷贝文件,,有这个自动拷贝应该会解决我的一部分问题,,刚刚接触QT,,也没有C的基础,,看东西总是感觉一头雾水, -  -!

点评

INCLUDEPATH 影响源代码中预处理指令 #include 的搜索路径。 LIBS 影响的是你构建时链接阶段如何与动态库链接,跟运行时怎么查找动态库没有关系。 windows下,应该把dll文件与exe文件置于同一目录下,才能保证正确查  详情 回复 发表于 2018-4-16 13:41
回复

使用道具 举报

 楼主| 发表于 2018-4-16 09:53:03 | 显示全部楼层
Since 发表于 2018-4-16 09:10
其他的我也不是很清楚,但是那个拷贝到 .exe 运行问题很大可能就是你的 Qt 的环境变量没有配置好导致的,看 ...

呃,,我说的很清楚了,,是MSVC 2015 不是安卓啊

点评

跟 Android 没有关系,Qt 安装了之后,不会自动加入系统变量的,直接点击 exe 屎跑不起来的,还是要配置路径,才能直接点开运行,我说的是这个~  详情 回复 发表于 2018-4-17 20:32
看到前面那个人的回答,我突然意识到一个问题。话说你显示丢失的是什么dll?是你拷贝的第三方库?还是QtCore、libc++之类的?如果是后者的话,那解决办法应该就是它发的那个链接里的。  详情 回复 发表于 2018-4-16 13:47
回复

使用道具 举报

发表于 2018-4-16 13:41:23 | 显示全部楼层
funny265 发表于 2018-4-16 09:51
问题2的意思是,,单独建一个QT application项目,,不使用多级目录,,按INCLUDEPATH += -Ltp/include/Vt ...

INCLUDEPATH 影响源代码中预处理指令 #include 的搜索路径。
LIBS 影响的是你构建时链接阶段如何与动态库链接,跟运行时怎么查找动态库没有关系。
windows下,应该把dll文件与exe文件置于同一目录下,才能保证正确查找。
你这种改变输出目录的方式我没试过,但正常如果使用 shadow builds 的话,也没改动什么的话,在windows下,会根据构建的选项把文件输出到 $OUT_PWD/debug 或者 $OUT_PWD/release ,这可能是影响运行时搜索库的原因,这时候可能需要你手动调整 DESTDIR 来输出到正确的位置。
还有我建议你看看 Qt Creator 的源码,尤其是 qtcreator.pri 能够把里面的 思路理清的话,哪怕只是照猫画虎也会有不少帮助。
回复

使用道具 举报

发表于 2018-4-16 13:47:42 | 显示全部楼层
funny265 发表于 2018-4-16 09:53
呃,,我说的很清楚了,,是MSVC 2015 不是安卓啊

看到前面那个人的回答,我突然意识到一个问题。话说你显示丢失的是什么dll?是你拷贝的第三方库?还是QtCore、libc++之类的?如果是后者的话,那解决办法应该就是它发的那个链接里的。
回复

使用道具 举报

发表于 2018-4-17 20:32:09 | 显示全部楼层
funny265 发表于 2018-4-16 09:53
呃,,我说的很清楚了,,是MSVC 2015 不是安卓啊

跟 Android 没有关系,Qt 安装了之后,不会自动加入系统变量的,直接点击 exe 屎跑不起来的,还是要配置路径,才能直接点开运行,我说的是这个~
回复

使用道具 举报

 楼主| 发表于 2018-4-18 09:36:38 | 显示全部楼层
miroox 发表于 2018-4-16 13:47
看到前面那个人的回答,我突然意识到一个问题。话说你显示丢失的是什么dll?是你拷贝的第三方库?还是QtC ...

当然不是QT的库,,是第三方的库,,我是在release下运行的exe理论上不需要配置环境变量吧,,不是只有debug才需要配置?
回复

使用道具 举报

 楼主| 发表于 2018-4-18 09:38:07 | 显示全部楼层
Since 发表于 2018-4-17 20:32
跟 Android 没有关系,Qt 安装了之后,不会自动加入系统变量的,直接点击 exe 屎跑不起来的,还是要配置 ...

提示我找不到的是第三方库,,我另一个项目可以直接运行,,我是在release下运行的,,跟环境变量没有关系。

点评

哦,好的好的,打扰了~  详情 回复 发表于 2018-4-18 10:00
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12下一页

funny265

    主题

    帖子

    21

    积分

    Qter1级会员

    Rank: 1

    积分
    21

Qter1级会员

发私信

Qt开源社区——开源 共享 自由

微信扫一扫
查看精品教程!