我正在尝试在Alpine Linux上使用g ++ / gcc编译OpenCascade(OCE)。它可以在Ubuntu上正常运行,但是同一项目在Apline上失败并显示以下错误:

OSD_MemInfo.cxx: In member function 'void OSD_MemInfo::Update()':
OSD_MemInfo.cxx:146:19: error: variable 'OSD_MemInfo::Update()::mallinfo aMI' has initializer but incomplete type
   struct mallinfo aMI = mallinfo();
                   ^~~
OSD_MemInfo.cxx:146:34: error: invalid use of incomplete type 'struct OSD_MemInfo::Update()::mallinfo'
   struct mallinfo aMI = mallinfo();
                                  ^
OSD_MemInfo.cxx:146:10: note: forward declaration of 'struct OSD_MemInfo::Update()::mallinfo'
   struct mallinfo aMI = mallinfo();
          ^~~~~~~~


我真不明白为什么这对于Alpine来说是一个错误,而对于Ubuntu而言却不是,任何人都不知道为什么或遇到类似问题吗?

最佳答案

作为参考,这是musl libc的问题,不包含mallinfo功能,因为它是GNU glibc的附加功能。要使OpenCascade在这样的系统上构建,可以在src/OSD/OSD_MemInfo.cxx中注释行146-147(对于OCE 0.18.3)。

// struct mallinfo aMI = mallinfo();
// myCounters[MemHeapUsage] = aMI.uordblks;


这导致仅忽略似乎是安全的内存堆使用情况,因为它仅用于信息和统计。

但是,还必须在src/OSD/OSD_signal.cxx中注释三行(221-222、342-343、398),这些行调用Feenableexcept(也仅在glibc中定义)

// if (fFltExceptions)
//   feenableexcept (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW);


在此之后,OpenCascade应该在Alpine linux上构建。

10-07 15:10