我试图在我的 mac osx leopard 机器上编译一个预先存在的 c++ 包,并得到以下错误:
错误:没有匹配函数调用“getline(char**, size_t*, FILE*&)”
这可能是因为 getline() 是 GNU 特定的扩展。
我可以以某种方式使 osx 默认 g++ 编译器识别此类 GNU 特定扩展吗?
(如果没有,我总是可以提供我自己的实现或 GNU 的原始实现,但如果可能的话,我更喜欢有一个“更清洁”的解决方案)
我试图在我的 mac osx leopard 机器上编译一个预先存在的 c++ 包,并得到以下错误:
错误:没有匹配函数调用“getline(char**, size_t*, FILE*&)”
这可能是因为 getline() 是 GNU 特定的扩展。
我可以以某种方式使 osx 默认 g++ 编译器识别此类 GNU 特定扩展吗?
(如果没有,我总是可以提供我自己的实现或 GNU 的原始实现,但如果可能的话,我更喜欢有一个“更清洁”的解决方案)
getline
在 glibc 2.10 及更高版本中定义,但在早期版本中没有,在 BSD 派生的 libc 中stdio.h
也没有(到目前为止;添加10.5 肯定没有,而 10.7 肯定有)。getline
GNU 库的变化源于 POSIX 2008 标准的变化,现在包括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++ 流+字符串的定义。