使用 musl libc 在 Alpine linux 上的 OpenCascade 编译失败(mallinfo:具有初始化程序但类型错误不完整)
OpenCascade compilation failure on Alpine linux with musl libc (mallinfo: has initializer but incomplete type error)
我正在尝试在 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(对于 OCE 0.18.3)中注释第 146-147 行。
// 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。
我正在尝试在 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(对于 OCE 0.18.3)中注释第 146-147 行。
// 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。