News:

When registered with our forums, feel free to send a "here I am" post here to differ human beings from SPAM bots.

Main Menu

Building Codeblocks with LLVM Clang error

Started by jeybee, July 05, 2024, 04:31:44 AM

Previous topic - Next topic

jeybee

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?


stahta01

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.
C Programmer working to learn more about C++.
On Windows 10 64 bit and Windows 11 64 bit.
--
When in doubt, read the CB WiKi FAQ. [url="http://wiki.codeblocks.org"]http://wiki.codeblocks.org[/url]

jeybee

#2
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

Miguel Gimenez

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'|

jeybee

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.

jeybee

#5
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

jeybee

image of codeblocks running on arm32 windows 10

jeybee


Miguel Gimenez

Other managers (editormanager, filemanager...) use the exact same code. Did you change also their code, or they compiled flawlessly?

jeybee

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.

jeybee

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