c++ - 带有 musl libc 的 Alpine linux 上的 OpenCascade 编译失败(mallinfo : has initializer but incomplete type error)

标签 c++ compilation alpine-linux libc musl

我正在尝试在 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 上。

关于c++ - 带有 musl libc 的 Alpine linux 上的 OpenCascade 编译失败(mallinfo : has initializer but incomplete type error),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58554433/

相关文章:

linux - Docker 检查命令未显示所有 ENV 变量

arrays - 从 bash 到 ash shell : how to handle arrays defined by input? 的翻译

ruby - 不能在 Alpine Linux 上要求 ruby​​ gsl

c++ - boost线程破坏多态性

c++ - Qt 并且没有 moc_*.cpp 文件

c++ - Boost + Mingw-w64 + Boost 日志不起作用

python - 将Cython生成的.c文件编译成exe文件

c++ - 使用 CMake 进行单元测试,无需重复编译

c++ - 链接 boost - 对 `boost::serialization::singleton_module::get_lock()' 的 undefined reference

ios - 将 .dylib 或 .la 文件导入 iOS 项目