2009-07-12 84 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) 

或沿着這些線路的東西,你必須進行調整,以符合您自己的程序。