我试图编译我的Mac OSX豹机器上的预先存在的C ++封装,并得到了以下错误:
error: no matching function for call to 'getline(char**, size_t*, FILE*&)'
这可能是因为函数getline()是一个GNU特定扩展名。
我能以某种方式使OSX默认的G ++编译器识别这样的GNU特定扩展?
(如果没有,我随时可以提供自己的实现或GNUS原单,但我更喜欢有一个“干净”的解决方案,如果可能的话)
我试图编译我的Mac OSX豹机器上的预先存在的C ++封装,并得到了以下错误:
error: no matching function for call to 'getline(char**, size_t*, FILE*&)'
这可能是因为函数getline()是一个GNU特定扩展名。
我能以某种方式使OSX默认的G ++编译器识别这样的GNU特定扩展?
(如果没有,我随时可以提供自己的实现或GNUS原单,但我更喜欢有一个“干净”的解决方案,如果可能的话)
getline
定义在stdio.h
的glibc的版本2.10及更高版本,但不是在早期版本,也不是;(到目前为止添加 10.5绝对没有getline
在BSD衍生的libc和10.7肯定不会)。
在GNU库中的变化是因为在2008年POSIX标准,现在包括一个变化的大约getline
。
据推测,这会传播到其他的libc随着时间的推移。 在此同时,我明白,这是造成麻烦了很多项目。
您可以从GNU下载一个单机版本 。
一般情况下,解决方案是使用autoconf
或一些类似的工具来确定当前平台是否已getline
或没有,只在需要时提供自己的定义。
例:
# configure.ac
AC_CHECK_FUNCS([getline])
// compat.h
#include "config.h"
#ifndef HAVE_GETLINE
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
#endif
// getline.c
ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
/* definition */
}
# Makefile.am
program_LDADD = $(if $(HAVE_GETLINE),,getline.o)
或沿着这些线路的东西,你必须进行调整,以符合您自己的程序。
我不知道我曾经看到“函数getline”的具体定义这里是一个我所知道的,它使用C ++流+字符串。
http://www.cplusplus.com/reference/string/getline/