我正在尝试在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下编译的方式解决此问题?
答案 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;
}