【问题标题】:Compiler can't find 'aligned_alloc' function编译器找不到“aligned_alloc”函数
【发布时间】:2019-03-17 13:09:34
【问题描述】:

我正在尝试从aligned alloc 启动示例代码:

#include <cstdio>
#include <cstdlib>

int main()
{
    int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);

    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

我的编译器给了我这个错误:

$ g++-mp-8 main.cpp -std=c++17
main.cpp:10:38: error: no member named 'aligned_alloc' in namespace 'std'
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));

我正在使用 macOS High Sierra 10.13.6 并尝试使用 Macport 的 GCC 7.3.0、8.2.0 和 CLang(Apple LLVM 版本 10.0.0)编译此代码,它们都会产生相同的错误。

编辑:无论是否存在std::,它都不起作用。

Edit2:我安装了 macOS Mojave 并没有解决问题。我希望它会重新安装 macOS 的工具链,但它没有。所以我想在得到更具体的答案之前,我无法接受提供的答案。

【问题讨论】:

  • 您链接的示例代码在std 中没有aligned_alloc。去掉aligned_alloc前面的std::还能用吗?
  • @Blaze 不,它不起作用。
  • @Blaze 通过包含cstdlib,Verloren 获得了来自stdlib.h 的C 库功能,并将其放置在命名空间std 中。事实上,单击参考页面底部指向 C++ 等效项的链接显示了与问题中的示例相同的示例。
  • 这几乎可以肯定只是您的工具链中缺少的功能。你能链接到它的文档/状态吗?例如High Sierra 上的 XCode 9 也没有 std::optional 和其他一些东西,尽管名义上与 C++17 兼容。

标签: c++ macos gcc clang c++17


【解决方案1】:

我没有使用 macOS,但我在使用自定义 g++ 的 linux 上遇到了类似的问题。如果您查看cstdlib 标头,则有类似

#if __cplusplus >= 201703L && defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
  using ::aligned_alloc;
#endif

所以 aligned_alloc 只有在 C++17 可用且 glibcxx 支持的情况下才会被拉入 std 命名空间。如果定义了_GLIBCXX_HAVE_ALIGNED_ALLOC,您可以检查x86_64-linux-gnu/bits/c++config.h(或macOS 上的类似内容)。如果不是你的 glibc 版本太旧了。

对于 clang 和 libc++ 实现 aligned_alloc 如果定义了 _LIBCPP_HAS_C11_FEATURES 则可用,这又取决于最新版本的 glibc。

您也可以使用boost

【讨论】:

  • 很可能是这种情况,因为在我的c++config.h(位于/usr/include/c++/4.2.1/bits/)中甚至不包含_GLIBCXX_HAVE_ALIGNED_ALLOC_LIBCPP_HAS_C11_FEATURES。但是,我不知道如何为 Mac 更新 glibc,谷歌搜索并没有多大帮助。我会尝试安装 Mojave,希望能修复它。
  • 正如我所说,我没有使用 macOS,因此可能会有所不同。安装自定义 glibc 要求很高。如果std::aligned_alloc 不可用,我切换到boost::aligned_alloc,请参阅here
  • 不幸的是,boost 对我来说不是一个选择。寻找替代方案确实对我有帮助,但并不能解决问题。
【解决方案2】:

正如公认的答案所提到的,使用boost::align::aligned_alloc 可以解决问题。

要在不修改源的情况下修复错误,只需在文件顶部添加以下内容:

#ifdef __APPLE__
#include <boost/align/aligned_alloc.hpp>
using boost::alignment::aligned_alloc;
#endif

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2015-06-27
    • 2019-01-24
    相关资源
    最近更新 更多