gloo icon indicating copy to clipboard operation
gloo copied to clipboard

[vcpkg] Fix the order of structures to adapt to the linu kernel

Open FrankXie05 opened this issue 9 months ago • 4 comments

Hi, all. I am the maintainer of vcpkg.

Recently we received a build error regarding gloo. https://github.com/microsoft/vcpkg/issues/38852

Reproduce:

git clone https://github.com/microsoft/vcpkg
cd vcpkg/
./vcpkg install gloo:x64-linux

Error:

FAILED: gloo/CMakeFiles/gloo.dir/common/linux.cc.o 
/usr/bin/c++  -I/mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/src/4842d821e2-a23aea63a5.clean -I/mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/x64-linux-dbg -fPIC -std=c++11 -fPIC -g -MD -MT gloo/CMakeFiles/gloo.dir/common/linux.cc.o -MF gloo/CMakeFiles/gloo.dir/common/linux.cc.o.d -o gloo/CMakeFiles/gloo.dir/common/linux.cc.o -c /mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/src/4842d821e2-a23aea63a5.clean/gloo/common/linux.cc
In file included from /mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/src/4842d821e2-a23aea63a5.clean/gloo/common/linux.cc:15:
/usr/include/linux/ethtool.h: In function ‘int gloo::getInterfaceSpeedGLinkSettings(int, ifreq*)’:
/usr/include/linux/ethtool.h:2214:17: error: flexible array member ‘ethtool_link_settings::link_mode_masks’ not at end of ‘struct gloo::getInterfaceSpeedGLinkSettings(int, ifreq*)::<unnamed>’
 2214 |         __u32   link_mode_masks[];
      |                 ^~~~~~~~~~~~~~~
/mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/src/4842d821e2-a23aea63a5.clean/gloo/common/linux.cc:192:11: note: next member ‘__u32 gloo::getInterfaceSpeedGLinkSettings(int, ifreq*)::<unnamed struct>::link_mode_data [381]’ declared here
  192 |     __u32 link_mode_data[link_mode_data_nwords];
      |           ^~~~~~~~~~~~~~
/mnt/c/Kiko/Tools/vcpkg/buildtrees/gloo/src/4842d821e2-a23aea63a5.clean/gloo/common/linux.cc:190:10: note: in the definition of ‘struct gloo::getInterfaceSpeedGLinkSettings(int, ifreq*)::<unnamed>’
  190 |   struct {
      |          ^

Solution: I think the flexible array member link_mode_masks should be at the end of the structure, otherwise it is illegal in C++.

And this structure requires dynamic allocation of memory to ensure that the flexible array members have enough space to store the required data.

I reorganized the structure and used malloc for dynamic allocation of memory. I will get your help as soon as possible. :)

FrankXie05 avatar May 22 '24 07:05 FrankXie05