Looking back in the thread, I found the example code, and I see that MSVC refuses to inline this helper, but clang will inline it. I believe clang is permitted to inline it, MSVC will export the static data member (_the_keyboard), so everything should work as long as you provide a definition of _the_keyboard in the DLL and set -DBUILDING_DLL.
Example: $ cat t.cpp #if defined (BUILDING_DLL) #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif class DLL_API Keyboard { public: Keyboard (); ~Keyboard (); static Keyboard& the_keyboard() { return *_the_keyboard; } protected: static Keyboard* _the_keyboard; }; #if defined(BUILDING_DLL) Keyboard *Keyboard::_the_keyboard = nullptr; #else Keyboard &useit() { return Keyboard::the_keyboard(); } #endif $ cl -c t.cpp -O2 -DBUILDING_DLL && dumpbin -directives t.obj ... /EXPORT:?_the_keyboard@Keyboard@@1PEAV1@EA,DATA ... clang-cl does support /Ob0 if you want to prevent it from inlining, but that's a big hammer, you could use __declspec(noinline) as a more targeted workaround. So, I think this just comes down to different inliner heuristics in MSVC and clang. If you provide and export a definition of this static global, things should link as expected. On Wed, Sep 22, 2021 at 9:50 AM David Blaikie <dblai...@gmail.com> wrote: > Probably Reid and Hans are folks to start with for Windows support > > On Wed, Sep 22, 2021 at 4:38 AM Jeffrey Walton via cfe-users < > cfe-users@lists.llvm.org> wrote: > >> On Wed, Sep 22, 2021 at 7:21 AM John Emmas via cfe-users >> <cfe-users@lists.llvm.org> wrote: >> > >> > On 21/09/2021 14:24, John Emmas via cfe-users wrote: >> > > >> > > clang-cl /? reveals that it'll handle the Microsoft variant of /Ob0 >> > > ... >> > All the signs here are that Clang is still trying to inline stuff - even >> > when it's been told not to... so is there some way I could check if it >> > responds correctly to "/Ob0"? Maybe ask a question on cfe-dev ? >> >> LLVM dev would probably be a good place to bring up the topic. >> >> Several people work on the Windows port. There's one person in >> particular who does most of the heavy lifting (but I don't recall the >> person's name). LLVM dev is where to find the people. >> >> Jeff >> _______________________________________________ >> cfe-users mailing list >> cfe-users@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users >> >
_______________________________________________ cfe-users mailing list cfe-users@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users