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'|
Quote from: Miguel Gimenez on July 05, 2024, 05:31:06 PM
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'|
with llvm clang it compiles and is a usable app. just ported this to arm32, running on the microsoft surface 1/2 nvidia arm soc.
one thing i noticed is the resource.rc file takes the arch of the machine that it's compiling on and not the host machine it's being compiled for
image of codeblocks running on arm32 windows 10
image of compiling win32 gui tempate app
Other managers (editormanager, filemanager...) use the exact same code. Did you change also their code, or they compiled flawlessly?
Quote from: Miguel Gimenez on July 05, 2024, 06:37:31 PM
Other managers (editormanager, filemanager...) use the exact same code. Did you change also their code, or they compiled flawlessly?
yes all of them needed changing in the same way. no resulting issues with compiling due to it.
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