2

mac osxleopardマシンで既存のc++パッケージをコンパイルしようとすると、次のエラーが発生します。

    エラー:'getline(char **、size_t *、FILE *&)'の呼び出しに一致する関数がありません

これはおそらく、getline()がGNU固有の拡張機能であるためです。

どういうわけか、osxのデフォルトのg ++​​コンパイラにそのようなGNU固有の拡張機能を認識させることはできますか?

(そうでない場合は、いつでも独自の実装またはGNUの元の実装を提供できますが、可能であれば「よりクリーンな」ソリューションを使用することをお勧めします)

4

3 に答える 3

5

getlinestdio.hはglibc バージョン 2.10 以降で定義されていますが、以前のバージョンでは定義されておらず、BSD 派生の libc では(これまでのところ、追加された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 に答える