在mac osx上使用gnu / c getline()编译c ++代码?

时间:2009-07-12 22:38:41

标签: c++ macos g++ gnu incompatibility

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

    error: no matching function for call to 'getline(char**, size_t*, FILE*&)'

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

你可以download a stand alone version from GNU

答案 1 :(得分: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)

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

答案 2 :(得分:0)

我不确定我是否曾经看到过'getline'的具体定义是我所知道的使用c ++流+字符串的定义。

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