Linux _SC_PHYS_PAGES在Mac OS X上无效

时间:2015-05-28 15:56:57

标签: c++ linux macos

我正在尝试在Mac OS上编译一个在Linux下没有任何问题的项目。我在两个操作系统上都使用GCC。除了我设法解决的其他问题,我在尝试在OSX上编译时遇到以下错误:

  window.onload=balancecolumns;
  window.addEventListener('resize', balancecolumns, false);

error: ‘_SC_PHYS_PAGES’ was not declared in this scope long pages = sysconf(_SC_PHYS_PAGES); ^ 包含在发生此错误的文件中。

如何以代码仍在Linux下编译的方式解决此问题?

1 个答案:

答案 0 :(得分:1)

虽然记录为可用,但显然它是一个文档错误,因为它不是。

但是,手册页确实指向了另一个界面:sysctl()。您可以使用sysctlbyname()接口以字节为单位获取物理内存。

#include <iostream>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sysctl.h>

int main () {
    size_t pagesz = sysconf(_SC_PAGE_SIZE);
    uint64_t mem;
    size_t len = sizeof(mem);
    sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
    std::cout << mem << '\n';
    std::cout << mem/pagesz << '\n';
    std::cout << mem/1024/1024/1024 << '\n';
}

为了模仿两个编译环境的功能,我将创建一个包装函数并根据条件编译修改函数的功能。

#define PHYS_PAGES get_phys_pages()

unsigned get_phys_pages () {
#if USE_SYSCTL_HW_MEMSIZE
    uint64_t mem;
    size_t len = sizeof(mem);
    sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
    static unsigned phys_pages = mem/sysconf(_SC_PAGE_SIZE);
#elif USE_SYSCONF_PHYS_PAGES
    static unsigned phys_pages = sysconf(_SC_PHYS_PAGES);
#else
#   error "no way to get phys pages"
#endif
    return phys_pages;
}