Shared library on windows fails when using moc
-
@Mesrine said in Shared library on windows fails when using moc:
Why my others shared library works on windows without explicit export macros ?
None will work if you don't properly export the symbols - I don't see any shared library in your github repos
To build shared library you just say to cmake
qt-cmake -G Ninja -DCMAKE_BUILD_TYPE="release" -DCMAKE_INSTALL_PREFIX="../install" -DBUILD_SHARED_LIBS=ON ../
All my shared libraries work for windows it only fail when using MOC. The later is not a question is an affirmation.
-
To build shared library you just say to cmake
qt-cmake -G Ninja -DCMAKE_BUILD_TYPE="release" -DCMAKE_INSTALL_PREFIX="../install" -DBUILD_SHARED_LIBS=ON ../
All my shared libraries work for windows it only fail when using MOC. The later is not a question is an affirmation.
@Mesrine said in Shared library on windows fails when using moc:
-DBUILD_SHARED_LIBS=ON ..
I don't see how this should affect any code in e.g. https://github.com/EddyTheCo/Qpow-IOTA/blob/main/CMakeLists.txt apart from the naming of the library.
-
@Mesrine said in Shared library on windows fails when using moc:
-DBUILD_SHARED_LIBS=ON ..
I don't see how this should affect any code in e.g. https://github.com/EddyTheCo/Qpow-IOTA/blob/main/CMakeLists.txt apart from the naming of the library.
@Christian-Ehrlicher
Cmake will let know the compiler that I want a shared library. -
@Christian-Ehrlicher
Cmake will let know the compiler that I want a shared library.@Mesrine said in Shared library on windows fails when using moc:
Cmake will let know the compiler that I want a shared library.
ah, correct
But you should add the correct defines then as described in the Qt documentation.
-
@Mesrine said in Shared library on windows fails when using moc:
Cmake will let know the compiler that I want a shared library.
ah, correct
But you should add the correct defines then as described in the Qt documentation.
@Christian-Ehrlicher
I have tried but did not work either, maybe is another problem not related with the export macros.So if someone has been able to produce shared libraries on Windows while using MOC compiled sources it will be good to know how to do it in CMake.
-
@Christian-Ehrlicher
I have tried but did not work either, maybe is another problem not related with the export macros.So if someone has been able to produce shared libraries on Windows while using MOC compiled sources it will be good to know how to do it in CMake.
@Mesrine said in Shared library on windows fails when using moc:
I have tried but did not work either, maybe is another problem not related with the export macros.
Then finally show us what you tried...
-
@Christian-Ehrlicher
I have tried but did not work either, maybe is another problem not related with the export macros.So if someone has been able to produce shared libraries on Windows while using MOC compiled sources it will be good to know how to do it in CMake.
@Mesrine It does not matter what you have done. You have to add MYSHAREDLIB_EXPORT into your class definition
class MYSHAREDLIB_EXPORT MyClassBut it does not exist in your classes.
#include <QtCore/QtGlobal> #if defined(MYSHAREDLIB_LIBRARY) # define MYSHAREDLIB_EXPORT Q_DECL_EXPORT #else #define MYSHAREDLIB_EXPORT Q_DECL_IMPORT #endif
When you build your lib, add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY). This means your lib exports these classes
while MYSHAREDLIB_EXPORT=Q_DECL_EXPORT since MYSHAREDLIB_LIBRARY is defined.But in your main application, do not add it. However, the headers of all classes in your main application which use the lib have to have MYSHAREDLIB_EXPORT as well. That means these classes import the lib while MYSHAREDLIB_EXPORT=Q_DECL_IMPORT
since MYSHAREDLIB_LIBRARY is not defined . -
@Mesrine It does not matter what you have done. You have to add MYSHAREDLIB_EXPORT into your class definition
class MYSHAREDLIB_EXPORT MyClassBut it does not exist in your classes.
#include <QtCore/QtGlobal> #if defined(MYSHAREDLIB_LIBRARY) # define MYSHAREDLIB_EXPORT Q_DECL_EXPORT #else #define MYSHAREDLIB_EXPORT Q_DECL_IMPORT #endif
When you build your lib, add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY). This means your lib exports these classes
while MYSHAREDLIB_EXPORT=Q_DECL_EXPORT since MYSHAREDLIB_LIBRARY is defined.But in your main application, do not add it. However, the headers of all classes in your main application which use the lib have to have MYSHAREDLIB_EXPORT as well. That means these classes import the lib while MYSHAREDLIB_EXPORT=Q_DECL_IMPORT
since MYSHAREDLIB_LIBRARY is not defined .@JoeCFD said in Shared library on windows fails when using moc:
#if defined(_WIN32) || defined(WIN32)
This is not needed and even counter-productive when you want to hide the symbols on linux.
-
@JoeCFD said in Shared library on windows fails when using moc:
#if defined(_WIN32) || defined(WIN32)
This is not needed and even counter-productive when you want to hide the symbols on linux.
@Christian-Ehrlicher Got it, thanks. Q_DECL_EXPORT and Q_DECL_IMPORT have it already. But for non Qt code, this is needed.
-
@Christian-Ehrlicher Got it, thanks. Q_DECL_EXPORT and Q_DECL_IMPORT have it already. But for non Qt code, this is needed.
@JoeCFD said in Shared library on windows fails when using moc:
But for non Qt code, this is needed.
Even then I would use the correct attribution. Hiding the symbols by default on linux will help the linker and startup time and (iirc) also the optimizer in the linker since it can remove unused functions / inline stuff when it's not visible from outside.
-
@Mesrine It does not matter what you have done. You have to add MYSHAREDLIB_EXPORT into your class definition
class MYSHAREDLIB_EXPORT MyClassBut it does not exist in your classes.
#include <QtCore/QtGlobal> #if defined(MYSHAREDLIB_LIBRARY) # define MYSHAREDLIB_EXPORT Q_DECL_EXPORT #else #define MYSHAREDLIB_EXPORT Q_DECL_IMPORT #endif
When you build your lib, add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY). This means your lib exports these classes
while MYSHAREDLIB_EXPORT=Q_DECL_EXPORT since MYSHAREDLIB_LIBRARY is defined.But in your main application, do not add it. However, the headers of all classes in your main application which use the lib have to have MYSHAREDLIB_EXPORT as well. That means these classes import the lib while MYSHAREDLIB_EXPORT=Q_DECL_IMPORT
since MYSHAREDLIB_LIBRARY is not defined .@JoeCFD said in Shared library on windows fails when using moc:
MYSHAREDLIB_LIBRARY
Yes, I tried that and give the same error.
Then my question is when should i define MYSHAREDLIB_LIBRARY in cmake?
When compiling the library?
If compiling the client should i set MYSHAREDLIB_LIBRARY?In my case compiling the client download the source code of the library and compile the source code.
The target resulting from that shared library is linked to the client using cmake .Maybe i found my problem while writing this.
I will do what Qt says(exactly :)) and try again, I llet you know the result and the code.Thanks.
-
@JoeCFD said in Shared library on windows fails when using moc:
MYSHAREDLIB_LIBRARY
Yes, I tried that and give the same error.
Then my question is when should i define MYSHAREDLIB_LIBRARY in cmake?
When compiling the library?
If compiling the client should i set MYSHAREDLIB_LIBRARY?In my case compiling the client download the source code of the library and compile the source code.
The target resulting from that shared library is linked to the client using cmake .Maybe i found my problem while writing this.
I will do what Qt says(exactly :)) and try again, I llet you know the result and the code.Thanks.
@Mesrine said in Shared library on windows fails when using moc:
Then my question is when should i define MYSHAREDLIB_LIBRARY in cmake?
When compiling the library?add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY)
And instead 'MYSHAREDLIB' you should use your library name...
-
@JoeCFD said in Shared library on windows fails when using moc:
But for non Qt code, this is needed.
Even then I would use the correct attribution. Hiding the symbols by default on linux will help the linker and startup time and (iirc) also the optimizer in the linker since it can remove unused functions / inline stuff when it's not visible from outside.
@Christian-Ehrlicher
Good to know, Thanks. I have not used Windows for ages.#if __GNUC__ >= 4 #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) #else #define DLL_PUBLIC #define DLL_LOCAL #endif
-
@Christian-Ehrlicher
Good to know, Thanks. I have not used Windows for ages.#if __GNUC__ >= 4 #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) #else #define DLL_PUBLIC #define DLL_LOCAL #endif
@JoeCFD You have then compile with
-fvisibility-inlines-hidden -fvisibility=hidden
and get the same behavior like the (default) windows behavior. See CMAKE_CXX_VISIBILITY_PRESET for more information on how to use it platform independent with cmake. -
@JoeCFD said in Shared library on windows fails when using moc:
MYSHAREDLIB_LIBRARY
Yes, I tried that and give the same error.
Then my question is when should i define MYSHAREDLIB_LIBRARY in cmake?
When compiling the library?
If compiling the client should i set MYSHAREDLIB_LIBRARY?In my case compiling the client download the source code of the library and compile the source code.
The target resulting from that shared library is linked to the client using cmake .Maybe i found my problem while writing this.
I will do what Qt says(exactly :)) and try again, I llet you know the result and the code.Thanks.
-
@JoeCFD You have then compile with
-fvisibility-inlines-hidden -fvisibility=hidden
and get the same behavior like the (default) windows behavior. See CMAKE_CXX_VISIBILITY_PRESET for more information on how to use it platform independent with cmake.@Christian-Ehrlicher Thanks. Learn more things from you.
-
@Mesrine It does not matter what you have done. You have to add MYSHAREDLIB_EXPORT into your class definition
class MYSHAREDLIB_EXPORT MyClassBut it does not exist in your classes.
#include <QtCore/QtGlobal> #if defined(MYSHAREDLIB_LIBRARY) # define MYSHAREDLIB_EXPORT Q_DECL_EXPORT #else #define MYSHAREDLIB_EXPORT Q_DECL_IMPORT #endif
When you build your lib, add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY). This means your lib exports these classes
while MYSHAREDLIB_EXPORT=Q_DECL_EXPORT since MYSHAREDLIB_LIBRARY is defined.But in your main application, do not add it. However, the headers of all classes in your main application which use the lib have to have MYSHAREDLIB_EXPORT as well. That means these classes import the lib while MYSHAREDLIB_EXPORT=Q_DECL_IMPORT
since MYSHAREDLIB_LIBRARY is not defined . -
@Mesrine It does not matter what you have done. You have to add MYSHAREDLIB_EXPORT into your class definition
class MYSHAREDLIB_EXPORT MyClassBut it does not exist in your classes.
#include <QtCore/QtGlobal> #if defined(MYSHAREDLIB_LIBRARY) # define MYSHAREDLIB_EXPORT Q_DECL_EXPORT #else #define MYSHAREDLIB_EXPORT Q_DECL_IMPORT #endif
When you build your lib, add target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY). This means your lib exports these classes
while MYSHAREDLIB_EXPORT=Q_DECL_EXPORT since MYSHAREDLIB_LIBRARY is defined.But in your main application, do not add it. However, the headers of all classes in your main application which use the lib have to have MYSHAREDLIB_EXPORT as well. That means these classes import the lib while MYSHAREDLIB_EXPORT=Q_DECL_IMPORT
since MYSHAREDLIB_LIBRARY is not defined .grep on the sources of qt gives:
grep -r "Q_DECL_IMPORT" qcompilerdetection.qdoc: \sa Q_DECL_IMPORT qcompilerdetection.qdoc: \macro Q_DECL_IMPORT qtconfigmacros.h:# define Q_AUTOTEST_EXPORT Q_DECL_IMPORT qversiontagging.h: extern "C" Q_DECL_IMPORT const char sym; \ qcompilerdetection.h:# define Q_DECL_IMPORT __declspec(dllimport) qcompilerdetection.h:# define Q_DECL_IMPORT __attribute__((visibility("default"))) qcompilerdetection.h:# define Q_DECL_IMPORT __declspec(dllimport) qcompilerdetection.h:# define Q_DECL_IMPORT __declspec(dllimport) qcompilerdetection.h:# define Q_DECL_IMPORT __attribute__((visibility("default"))) qcompilerdetection.h:#ifndef Q_DECL_IMPORT qcompilerdetection.h:# define Q_DECL_IMPORT
-
@JoeCFD said in Shared library on windows fails when using moc:
MYSHAREDLIB_EXPORT
But still i have to define MYSHAREDLIB_EXPORT to nothing if compiling in other system apart from windows?
-
@JoeCFD said in Shared library on windows fails when using moc:
MYSHAREDLIB_EXPORT
But still i have to define MYSHAREDLIB_EXPORT to nothing if compiling in other system apart from windows?
@Mesrine said in Shared library on windows fails when using moc:
But still i have to define MYSHAREDLIB_EXPORT to nothing if compiling in other system apart from windows?
Why? Simply use it as explained in the Qt documentation...