2

我试图在我的 mac osx leopard 机器上编译一个预先存在的 c++ 包,并得到以下错误:

    错误:没有匹配函数调用“getline(char**, size_t*, FILE*&)”

这可能是因为 getline() 是 GNU 特定的扩展。

我可以以某种方式使 osx 默认 g++ 编译器识别此类 GNU 特定扩展吗?

(如果没有,我总是可以提供我自己的实现或 GNU 的原始实现,但如果可能的话,我更喜欢有一个“更清洁”的解决方案)

4

3 回答 3

5

getline在 glibc 2.10 及更高版本中定义,但在早期版本中没有,在 BSD 派生的 libc 中stdio.h也没有(到目前为止;添加10.5 肯定没有,而 10.7 肯定有)。getline

GNU 库的变化源于 POSIX 2008 标准的变化,现在包括getline.

据推测,随着时间的推移,这将传播到其他 libc。同时,我知道它给很多项目带来了麻烦。

您可以从 GNU 下载独立版本

于 2009-07-12T23:04:50.073 回答
1

一般来说,解决方法是使用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)

或类似的东西,你必须调整它以匹配你自己的程序。

于 2009-07-13T03:45:10.033 回答
0

我不确定我是否见过这里的“getline”的具体定义是我所知道的使用 c++ 流+字符串的定义。

http://www.cplusplus.com/reference/string/getline/

于 2009-07-12T23:01:54.743 回答