【问题标题】:How do I prevent qmake creating an extra "moc" folder in this 'out of source' build scenario?如何防止 qmake 在这种“源外”构建场景中创建额外的“moc”文件夹?
【发布时间】:2011-10-06 15:30:01
【问题描述】:

(抱歉,我想不出更好的解释方式,除了包含以下细节)

预构建结构:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
      └ ...

“Project.pro”的内容:

TEMPLATE = subdirs
SUBDIRS = Source

“Source.pro”的内容:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS +=  My_Library

“My_Library.pro”的内容:

include(../../ProjectSettings.pri)

TEMPLATE = lib
SOURCES += library.cpp

“ProjectSettings.pri”的内容

TARGET = $$basename(_PRO_FILE_PWD_)

Debug:buildDir = "Debug"
Release:buildDir = "Release"

DESTDIR =     $$PWD/$$buildDir/bin
OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui

构建后结构:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
  └ Debug\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o
  └ My_Library\   <------ WTF
    └ moc\
  └ Release\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o

问题

想法是

  • 在项目文件夹中运行qmake -recursive
  • 构建所有指定的子项目
  • 吐出一堆组织良好的中间文件
  • 并将子项目的所有二进制文件放在一个文件夹中
  • 所有这些都根据调试或发布范围进行隔离

它似乎工作得很好,除了项目文件夹中的每个“子项目”有一个额外的文件夹,每个文件夹都包含一个 moc 文件夹,我在上面突出显示了“WTF”*

问题

  1. .pro 文件中的哪个(组合)指令生成“WTF”文件夹?
  2. “WTF”文件夹的用途是什么? (请记住 Debug 和 Release 范围指定它们自己的 moc)
  3. 有没有办法防止“WTF”文件夹被创建?

我还没有任何会导致 MOC 输出 moc 文件的源文件,所以目前所有 moc 文件夹都是空的。

* "WTF" = "什么文件夹"

【问题讨论】:

    标签: c++ qt4 build-process qmake out-of-source


    【解决方案1】:

    1. 在运行调试和发布范围之前创建文件夹。 qmake 生成一个主 make 文件 (Makefile),如果有源要构建:两个子 make 文件 (Makefile.DebugMakefile.Release)。范围是为子级设置的,但不是为父级设置的,因此 qmake 决定它必须创建不存在的文件夹。

    2.据我所知,它没有用于任何用途。

    3. 通过添加已经存在的 buildDir 定义(在本例中为 Source),qmake 不会费心制作任何额外的临时文件夹。此外,应该修改范围测试(请参阅herehere 了解原因)。这归结为以下ProjectSettings.pri

    PROJECT_NAME = $$basename(PWD)
    TARGET = $$basename(_PRO_FILE_PWD_)
    
    buildDir = Source
    CONFIG( debug, debug|release ) {
        buildDir = "Debug"
    } else {
        buildDir = "Release"
    }
    
    DESTDIR =     $$PWD/$$buildDir/bin
    OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
    MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
    RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
    UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui
    

    不太确定为什么会这样,但似乎可以解决问题。

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2021-08-10
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多