clang找不到aligned_alloc函数

9

我在Mac OS X主机上运行以下版本的clang:

$ clang -v
Apple LLVM version 8.1.0 (clang-802.0.42)

我有一些代码,使用了C11的aligned_alloc()函数来分配对齐的内存块。

我正在使用-std=c11标志编译我的二进制文件:

...
clang -g -Wall -Wextra -mavx -std=c11 -D__USE_POSIX -D__STDC_CONSTANT_MACROS -D__STDINT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -O2 -c my_binary.c -o my_binary.o; \
clang -g -Wall -Wextra -mavx -std=c11 -D__USE_POSIX -D__STDC_CONSTANT_MACROS -D__STDINT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -O2 my_binary.o -o my_binary -lm; \
...

我正在包含stdlib.h并添加POSIX标志。来自my_binary.h
...
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L
#endif /* getline() support */

#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
#endif /* aligned_alloc() support */

#include <stdlib.h>
...

我收到了以下编译警告:
my_binary.c:245:15: warning: implicit declaration of function 'aligned_alloc' is invalid in C99 [-Wimplicit-function-declaration]
s->data = aligned_alloc(32, s->n * sizeof(*s->data));

这引发了以下错误:
Undefined symbols for architecture x86_64:
  "_aligned_alloc", referenced from:
      _bs_initialize_signal_avx in my_binary.o
      _bs_copy_signal_avx in my_binary.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [build] Error 1

我在使用clang时出了什么问题,导致编译忽略了C11标准的std标记?我能够在一个安装有gcc 5.3.0和glibc 2.22的CentOS 7(Linux)主机上编译不出错。

2
事实上,C11支持分为两个部分,语言和库。看起来你的编译器在语言方面是最新的,但是你的平台缺乏C11库的支持。所以这更多是关于你的操作系统安装以及苹果是否愿意更新其C库到C11的问题。 - Jens Gustedt
当我阅读Clang文档时,发现C11是默认的编译标准,即使我手动设置了这个标准,Clang也不支持C11? - Alex Reynolds
1
不,你的操作系统不支持C11,clang在这一切中毫无用处。上次我查看时,OS X在支持标准方面远远落后。他们的POSIX版本也相当老旧。 - Jens Gustedt
1
如果我正确阅读这个C11参考文档(https://en.cppreference.com/w/c/memory/aligned_alloc),`aligned_alloc`在指定的对齐方式不被实现支持时会失败,而`posix_memalign`则保证适用于任何是2的幂次方且是`sizeof(void *)的倍数的对齐方式。这并没有回答你的问题,但或许可以帮到你,你可以尝试使用posix_memalign`,在我写的一些代码中它表现得很好。 - Todd Lehman
1个回答

1
macOS 11.1 SDK对aligned_alloc的定义指出,此API在macOS 10.15之前不可用。对于需要使用此函数的C代码,10.14及更低版本将需要另外的解决方案。
C++程序可以使用更新的Clang/LLVM libc++(如Clang 12+),并链接到该库,而不是默认使用系统的libc++.1.dylib。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接