【问题标题】:Qt Automake separate include, ui, resource foldersQt Automake 单独包含、ui、资源文件夹
【发布时间】:2016-04-08 12:44:10
【问题描述】:

基于this link,我创建了一个基于 Autotools 的构建系统,它无需调用 QMAKE 即可接受 Qt UI 和 RSC 文件。

然而,我希望按以下方式将源文件、标题和 ui 文件分隔到文件夹中:

${srcdir}
├── Makefile.am
├── main.cc
├── include
│   └── mainwidget.h
├── src
│   └── mainwidget.cc
└── ui
    └── mainwidget.ui

并按以下方式对构建目录进行排序

${builddir}
├── include
│   └── ui_mainwidget.h
├── Makefile
├── main.o
├── mainwidget.o
└── moc_mainwidget.o

我的 Makefile.am 目前看起来像这样:

moc_%.cc: %.h
    @MOC@ -o$@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<

ui_%.h: %.ui
    @UIC@ -o $@ $<

qrc_%.cc: %.qrc
    @RCC@ -o $@ $<

bin_PROGRAMS = qthello
BUILT_SOURCES = ui_mainwidget.h

qthello_CXXFLAGS = -I$(srcdir)/include -I$(builddir)/include
qthello_CPPFLAGS = $(QT_CPPFLAGS)

qthello_LDFLAGS = $(QT_LDFLAGS)
qthello_LDADD = $(QT_LIBS)

qthello_SOURCES =       \
    moc_mainwidget.cc   \
    mainwidget.cc       \
    main.cc

如果 ui 类文件位于 $(srcdir) 中,这可以正常工作,但只是将它们移动到所需的目录并更改 Makefile.am 中的预期行并不会产生所需的结果。也就是说,做这些改变是行不通的:

BUILT_SOURCES = include/ui_mainwidget.h
[ ... ]
qthello_SOURCES =           \
    src/moc_mainwidget.cc   \
    src/mainwidget.cc       \
    main.cc

在我看来,必须对构建规则进行一些更改,以确保 $(builddir) 中存在 include、src、ui 目录,并且传递正确的输入文件。然而,我在编写此类构建规则方面缺乏经验,谷歌似乎没有答案。

有没有简单的便携方法来实现这一点?

【问题讨论】:

    标签: c++ qt autotools automake


    【解决方案1】:

    感谢this post,我最终确实找到了解决方案。

    以下是最终的 Makefile.am

    moc_%.cc: ../include/%.h
        $(MKDIR_P) $(@D)
        @MOC@ -o$@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<
    
    ui_%.h: ../ui/%.ui
        $(MKDIR_P) $(@D)
        @UIC@ -o $@ $<
    
    qrc_%.cc: %.qrc
        $(MKDIR_P) $(@D)
        @RCC@ -o $@ $<
    
    clean-local:
        rm -rf ui/ include/
    
    bin_PROGRAMS = qthello
    
    BUILT_SOURCES =               \
        include/ui_mainwidget.h 
    
    qthello_CXXFLAGS =            \
           -I$(srcdir)/include    \
           -I$(builddir)/include
    
    qthello_CPPFLAGS = $(QT_CPPFLAGS)
    
    qthello_LFLAGS = $(QT_LDFLAGS)
    qthello_LDADD = $(QT_LIBS)
    
    qthello_SOURCES =              \
        ui/moc_mainwidget.cc       \
        src/mainwidget.cc          \
        main.cc
    

    请记住,AC_PROG_MKDIR_P 必须添加到 configure.ax

    【讨论】:

    • 不知道这个解决方案有多通用 - 在源代码树之外构建,等等? - 但它仍然是一个非常有用的问答。也基于Makefile.in 规则中的COMPILE 宏的原则。做得很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2011-06-30
    • 2022-01-24
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多