[cfe-users] Clang (with Visual Studio) wrongly complains about missing variables

Reid Kleckner via cfe-users cfe-users at lists.llvm.org
Wed Sep 22 10:21:25 PDT 2021


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 at Keyboard@@1PEAV1 at 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 <dblaikie at 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 at lists.llvm.org> wrote:
>
>> On Wed, Sep 22, 2021 at 7:21 AM John Emmas via cfe-users
>> <cfe-users at 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 at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20210922/92997e49/attachment.html>


More information about the cfe-users mailing list