2009-07-12 85 views
2

我试图编译我的Mac OSX豹机器上预先存在的C++封装,并得到了以下错误:在mac osx上使用gnu/c getline()编译C++代码?

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

这可能是因为函数getline()是一个GNU特定扩展名。

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

(如果没有,我随时可以提供自己的实现或GNUS原单,但我更喜欢有一个“干净”的解决方案,如果可能的话)我见过的具体定义

回答

5

getlinestdio.h定义在glibc的版本2.10及更高版本,但不是在早期版本中,也没有(至今; 添加 10.5绝对没有getline和10.7肯定不会)在BSD派生的libc。

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

推测,这会随着时间推移到其他libc。同时,我明白这对许多项目都造成了麻烦。

您可以download a stand alone version from GNU

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) 

或沿着这些线路的东西,你必须进行调整,以符合您自己的程序。