【问题标题】:Error compiling CPP application. "error: 'posix_memalign' was not declared in this scope"编译 CPP 应用程序时出错。 “错误:'posix_memalign' 未在此范围内声明”
【发布时间】:2018-04-30 04:40:54
【问题描述】:

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

错误:“posix_memalign”未在此范围内声明

现在可以在 stdlib.h 中找到 posix_memlig

项目的 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

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

附言 我能够毫无问题地在 Linux (Redhat) 上构建代码。

【问题讨论】:

  • 尝试删除-std=c++0x它会缩小声明的范围
  • 感谢您的建议,但它似乎更早地完全破坏了构建,因此这不是一个可行的选择

标签: c++ c++11 g++ cygwin


【解决方案1】:

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

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

稍后

我确实看到了 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.

【讨论】:

  • 我确实在 C:\cygwin64\usr\include\stdlib.h 中看到了该函数,但我在 C:\cygwin64\lib\gcc\x86_64-pc-cygwin\6.4 中看不到它.0\include\c++\stdlib.h
【解决方案2】:

[找到解决方案]

你好(我在 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 文件名时,程序确实出错了。这就是要处理的 stdlib.h。

我看到“POSIX_VISIBLE >= 200112”指令只影响了其中包含“posix_memalign”的一行代码。 (换句话说,“POSIX_VISIBLE”指令没有用于整个文件。)我考虑“注释”掉它,或者删除它。但后来非程序员的我得到了一个巧妙的想法,只需将“>=”更改为“

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2013-03-05
    • 2011-10-08
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多