Linux _SC_PHYS_PAGES不适用于Mac OS X

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

error: '_SC_PHYS_PAGES' was not declared in this scope long pages = sysconf(_SC_PHYS_PAGES); ^ 

发生此错误的文件中包含unistd.h

我怎样才能解决这个代码仍然在Linux下编译的方式?

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

但是,手册页确实指向了另一个接口: 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; }