I'm trying to build codeblocks with llvm clang, this has to be used as i am cross compiling. i've hit a snag that i can't figure out how to work around it
it's related to the manager.h
template <class MgrT> class DLLIMPORT Mgr
{
static MgrT *instance;
static bool isShutdown;
explicit Mgr(const Mgr<MgrT>&) { ; };
Mgr<MgrT>& operator=(Mgr<MgrT> const&) { ; };
protected:
Mgr() { assert(Mgr<MgrT>::instance == nullptr); }
virtual ~Mgr() { Mgr<MgrT>::instance = nullptr; }
public:
static bool Valid() { return instance; }
static MgrT* Get()
{
if (instance == nullptr)
{
if (isShutdown == false)
instance = new MgrT();
else
cbAssert(false && "Calling Get after the subsystem has been shutdown is an error!");
}
return instance;
}
static void Free()
{
isShutdown = true;
delete instance;
instance = nullptr;
}
};
template<> ColourManager* Mgr<ColourManager>::instance = nullptr;
template<> bool Mgr<ColourManager>::isShutdown = false;
cbcolourmanager.cpp|18|error: explicit specialization of 'instance' after instantiation|
how can i modify the code to get around this issue. i understand i need to declare the explicit specialization.. but how can i do this? how do i modify the header in such a way that this satisfies the c++ standard that llvm clang is trying to adhere to?
I did not see that error under MSys2 CLANG64 which uses
$ clang --version
clang version 18.1.8
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/msys64/clang64/bin
Tim S.
the fix for anyone encountering this error in the future is
template<class ColourManager> ColourManager* Mgr<ColourManager>::instance = nullptr;
template<class ColourManager> bool Mgr<ColourManager>::isShutdown = false;
credit for figuring it out goes to jonas schwoebel
https://stackoverflow.com/questions/64588313/initialization-of-static-template-member-in-crtp/64588437#64588437
With said change cbcolourmanager.cpp compiles, but when compiling the whole project you get this error (tested with MinGW):
manager.h|224|undefined reference to `Mgr<ColourManager>::isShutdown'|
here is an upload of the source https://github.com/jethrobull/codeblocks-20.03-arm
had to disable the debugger , have not as yet cross compiled drmingw to get the dll's needed. hopefully will get that going soon.
i'll also update here with the wxWidgets-3.1.4 source, after making a few changes was compiled as standard with the mingw32-make -f makefile.gcc SHARED=1 MONOLITHIC=1 BUILD=release UNICODE=1
command using the llvm clang here https://github.com/mstorsjo/llvm-mingw/releases/tag/20240619