[Interest] Three-file modules vs. moc

Tony Rietwyk tony at rightsoft.com.au
Thu Aug 27 15:43:31 CEST 2020


Hi Bernhard,

I use plain .pro and .pri files with qmake to Visual Studio projects.  
Moc has a feature that prevents the output files being treated as 
separate compiles - if it finds the include in the relevant module 
.cpp.  It works really well for us with thousands of modules.  I not 
sure how that work flow translates to Qt Creator.

If you add

#include <moc_spinbox.cpp>

as the second line in spinbox.cpp, and then run qmake or whatever the 
Creator equivalent is.  After that, the moc steps will run as normal, 
and then the compile of spinbox.cpp without a separate compile for 
moc_spinbox.cpp.

Hope that helps,

Tony


On 27/08/2020 5:40 am, Bernhard Lindner wrote:
> Hi!
>
> Currently I am facing a problem with a Qt Creator managed Qt 5 project.
>
> The projects consists of a lot of modules and implements a special but useful file
> concept. Each module has 3 files:
>     module.hpp - Public types, macros and declarations
>     module.inl - Template function definitions, constexpr and inline function definitions
>     module.cpp - All other definitions
> module.cpp includes module.inl and module.inl includes module.hpp.
>
> I added all .hpp file names to the .pro file using Qt Creator. All moc relevant .hpp files
> are parsed fine by moc and a moc_module.cpp file is generated for each module as usual.
> Unfortunately the moc_module.cpp files includes module.hpp only, since module.inl are
> unknown to moc.
> So all function definitions from moc_module.inl are unknown during compilation of
> moc_module.cpp and I get undefined reference linker errors (e.g. for property related
> setters called in the moc_module.cpp code).
>
> Maybe I could use a lot of Q_MOC_RUN preprocessor conditions to work around but that would
> pollute the code awfully.
>
> How can I solve this problem on the moc side? Is there a way to tell moc via the .pro
> project on a per-module basis to include module.inl instead of (or along with) module.inl
> in moc_module.cpp?
>


More information about the Interest mailing list