0

我正在尝试在 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,有没有人知道为什么或遇到过类似的问题?

4

1 回答 1

2

作为参考,这是一个 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 上构建。

于 2019-10-27T04:17:21.913 回答