Error compiling CPP application. "error: 'posix_memalign' was not declared in this scope"

Error compiling CPP application. "error: 'posix_memalign' was not declared in this scope"

我正在尝试使用 g++ 6.4.0 在最新的 cygwin64 环境中编译 CPP 应用程序(一个开源项目),但出现以下错误:

error: 'posix_memalign' was not declared in this scope

现在 posix_memlign 可以在 stdlib.h 中找到,如果您编译最简单的 CPP "hello world" 应用程序,调用 posix_memlign.[=12 不会有问题=]

项目的 make 文件报告了以下编译设置

g++ -DHAVE_CONFIG_H -I. -Wall -Wnon-virtual-dtor -I. -I./include -g -O3 -std=c++0x -g -O3 -std=c++0x -MT lib/rectangular_binary_matrix.lo -MD -MP -MF lib/.deps/rectangular_binary_matrix.Tpo -c lib/rectangular_binary_matrix.cc -DDLL_EXPORT -DPIC -o lib/.libs/rectangular_binary_matrix.o

所以它看起来不像是覆盖默认包含路径。有任何想法吗?

p.s。 我能够在 Linux (Redhat) 上毫无问题地构建代码。

posix_memalign 不是 C 标准库或 C++ 标准的一部分 库和 cygwin GCC 编译器不提供它,尽管其他 编译器可能会这样做,包括来自其他构建器的 GCC 编译器。

如果您愿意编辑项目源代码,您可以考虑使用 C 标准函数 aligned_alloc。它在 <cstdlib> 中提供,用于在 cygwin g++ 6.4.0

中进行 C++ 编译

以后

I do see the function in C:\cygwin64\usr\include\stdlib.h...

事实上你可以在头文件中找到函数声明 并不意味着编译器可以在预处理后看到它。相同 许多构建器可能会使用源头,暴露不同的 根据构建器的实现者设置向编译器声明 宏。在这种情况下,声明对你的编译器是隐藏的 __POSIX_VISIBLE >= 200112 是错误的事实。以 __ 开头的标识符是为实现者保留的。 查看 explanation of this macro 并注意评论:

 * The following private macros are used throughout the headers to control
 * which symbols should be exposed.  They are for internal use only, as
 * indicated by the leading double underscore, and must never be used outside
 * of these headers.

[已找到解决方案]

您好(我在关于同一问题的 2 个线程上发布了这篇文章)。

我来这里是因为我遇到了“POSIX_VISIBLE >= 200112”和“posix_memalign 未在此范围内声明”的问题,这导致程序编译停止。

我不是程序员,我自己尝试了几个小时的各种修复。然后终于用谷歌搜索并找到了这个网站。这里的解决方案对我不起作用,但我将描述有效的方法:

“posix_memalign”文本位于代码中包含的“stdlib.h”文件中。第一个问题是在我的“cygwin”目录中,我有 25 个“stdlib.h”实例!其中包括哪一个?!我对此很陌生,但我终于发现了

回声 | gcc -E -Wp,-v -

至少可以了解文件是从哪个目录“包含”的。这将“stdlib.h”文件的数量缩小到 4 个。在 4 个这样的文件中,只有一个有“posix_memalign”文本。我尝试更改 stdlib.h 的文件名以查看它是否会导致错误——并确认它是有问题的 stdlib.h。然而,这并不影响该计划。所以我在下一个目录中搜索了一个“stdlib.h”文件。那个“stdlib.h”文件中也有“POSIX”文本。因此,当我更改 stdlib.h 文件名时,程序 DID 出错了。这就是要处理的 stdlib.h。

我看到“POSIX_VISIBLE >= 200112”指令只影响了其中包含“posix_memalign”的一行代码。 (换句话说,“POSIX_VISIBLE”指令并未用于整个文件。)我考虑过将其“注释”掉或删除。但后来非程序员的我有了一个巧妙的想法,只需将“>=”更改为“<”。所以我现在有“POSIX_VISIBLE < 200112”。我保存了文件,运行 再次执行“configure”和“make”例程,结果很顺利。程序编译正确。

故事的寓意,如果您可以确定您的代码正在访问的文件(包含 POSIX 语句和 posix_memalign),您可能可以通过以下方式解决问题只是像我一样更改那个 POSIX_VISIBLE 运算符。 (并且您可能希望在编译完成后将该运算符切换回来,以防将来 stdlib.h 库文件需要被其他程序使用。)