Unsolved Is there a #define for checking if the compiler is Qt?
-
@kitfox why not use CMake so that you can specifically define whether or not to use Qt, and then decide which implementation source file to add to compilation?
-
If the user wants to compile with the Qt API using my modifications, I want the DLL import/export tags to resolve to the definitions defined in QtCore/qglobal.h. If they wish to use the original environment they were developed in, or some other non Qt environment, I would like the FFMPEGCPP_EXPORT tag to resolve to the empty string and the #include <QtCore/qglobal.h> left out so that they can compile with their libraries. Basically as this is an open source library, I'm trying to make minimal changes and leave it in a state such that it can still compile in its original environment, while also making it capable of compiling using the Qt environment.
-
I'm not familiar with cmake. I suppose I should learn it, but I haven't had the time.
-
Try
#if defined(QT_VERSION)
-
This post is deleted! -
@hskoglund
Where doesQT_VERSION
get defined, please? Isn't it via#include <QtGlobal>
, so it tells you whether or not you have already included that file? How do you decide whether to include that or not? That's the bit I don't get....@kitfox
OK, to be fair/clear, surrounding some Qt-only code in#if defined(QT_VERSION)
looks like a good model for most of your code. It's a clean symbol. So that's good.You still have to "get going" somewhere, to decide whether to define that or include
QtGlobal.h
or not in the first place. -
@JonB Yeah, I realized that after I made the last post. For now I'll add an extra define to my build file.
-
@kitfox
:) :) Which is what I've been trying to get at all along :) -
@JonB said in Is there a #define for checking if the compiler is Qt?:
Where does QT_VERSION get defined, please? Isn't it via #include <QtGlobal>, so it tells you whether or not you have already included that file? How do you decide whether to include that or not? That's the bit I don't get....
nope, its part of qmake, and the define is available inside the *.pro file therefore influencing the generated make file.
Its generally used to check if some features are available in the Qt version you're using or not, to therefore include specific files(or not)
-
@J-Hilk
Ah, now when I Googled yesterday I found a post (stackoverflow??) which said thatQT_VERSION
was defined inQtGlobal
. Admittedly I think the post was from years ago, but I often find Qt is behaving the same as at the turn of the millennium :) Ah, yes, see https://stackoverflow.com/a/24903583/489865. And that was as recent as 2015. If you think that is inaccurate, you might wish to post there :)What you say is actually a bit strange: the header files etc. belong to a particular Qt version, hence it would make sense if they define the Qt version for which they work. Defining your own value for
QT_VERSION
isn't going to help much when they were written for a different version.... -
@JonB qmake you're using defines which Qt version is used :-)
So, it is perfectly valid if qmake defines QT_VERSION. -
@jsulm
Since you posted, I have edited mine to link to the reference I used for this statement. Are the answers there wrong? Do you wish to correct them? :)Also, I have just looked at https://code.woboq.org/qt5/qtbase/src/corelib/global/qglobal.h.html. There, bold as brass, unconditional (e.g. it is not inside
#ifndef QT_VERSION
):#define QT_VERSION QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)
Does that not define the
QT_VERSION
, yes or no? -
@JonB you're also correct,
the first thing one does, when building the Qt libs, is building qmake, and IIRC that uses the QtGlobal of the source tree it belongs to...
-
@JonB said in Is there a #define for checking if the compiler is Qt?:
Does that not define the QT_VERSION, yes or no?
Correct. The
qmake
bootstrap has little to do with your code. I can't say for sure thatqmake
doesn't define the macro for your project, but it shouldn't (provided you've usedCONFIG -= qt
). -
@kitfox said in Is there a #define for checking if the compiler is Qt?:
That's right. I'm having trouble thinking of a way to rewrite ffmpeg-cpp_global.h so that it would work either inside of outside of a Qt environment. Currently
FFMPEGCPP_LIBRARY
is defined in the .pro file and acts as a switch - if it's included, thenFFMPEGCPP_EXPORT
transforms into instructions to export the definition to a dll. However, if it's not included (which it presumably would not be to anyone who wanted to use the library) it turns into a declaration to import the definition - instructions which depend on the Qt API to work.#ifdef IM_USING_QT #include <QtCore/qglobal.h> #if defined(FFMPEGCPP_LIBRARY) # define FFMPEGCPP_EXPORT Q_DECL_EXPORT #else # define FFMPEGCPP_EXPORT Q_DECL_IMPORT #endif #else #define FFMPEGCPP_EXPORT #endif
Sorry to take a step back here but I think we got sidetracked.
In the code posted the only "Qt" code is
Q_DECL_EXPORT
andQ_DECL_IMPORT
. They can easily be replaced with native code# if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) # define NQ_DECL_EXPORT __declspec(dllexport) # define NQ_DECL_IMPORT __declspec(dllimport) # else # define NQ_DECL_EXPORT __attribute__((visibility("default"))) # define NQ_DECL_IMPORT __attribute__((visibility("default"))) # endif #if defined(FFMPEGCPP_LIBRARY) # define FFMPEGCPP_EXPORT NQ_DECL_EXPORT #else # define FFMPEGCPP_EXPORT NQ_DECL_IMPORT #endif
Now it should build and link with any build system. If you are building the library itself the build system (qmake, qbs, CMake, Visual Studio, etc.) will need to add a compiler definition for
FFMPEGCPP_LIBRARY
while user of the library will not. This is 100% standard in C/C++ libraries -
@VRonin is correct that other ways are preferrable to define DLL import/export.
I also assumed that
QT_VERSION
had to be defined byqmake
. However, I had a quick look at the generatedMakefile
. And what is defined are things likeQT_CORE_LIB
,QT_WIDGETS_LIB
, etc. My guess is thatQT_WIDGETS_LIB
, e.g., will appear if you putQT += widgets
into your .pro file. And I would expect thatQT_CORE_LIB
is always defined when you compile with Qt.