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

发布于 2024-07-26 23:38:48 字数 305 浏览 8 评论 0原文

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

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

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

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

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

I'm trying to compile a pre-existing c++ package on my mac osx leopard machine, and get the following error:

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

This is probably because getline() is a GNU specific extension.

Can I somehow make the osx default g++ compiler recognize such GNU specific extensions?

(if not, I could always supply my own implementation or GNUs original one, but I prefer to have a "cleaner" solution if possible)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

标点 2024-08-02 23:38:48

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

GNU 库中的更改是由于 POSIX 2008 标准的更改而引起的,其中现在包括 getline

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

您可以从 GNU 下载独立版本

getline is defined in stdio.h in glibc version 2.10 and later, but not in earlier versions, nor (so far; added 10.5 definitely didn't have getline, and 10.7 definitely does) in the BSD derived libc.

The change in the GNU libraries came about because of a change in the POSIX 2008 standard, which now includes getline.

Presumably, this will propogate to other libc over time. In the mean time, I understand that it is causing trouble for a lot of projects.

You can download a stand alone version from GNU.

魂ガ小子 2024-08-02 23:38:48

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

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

Generally, the solution is to use autoconf or some similar tool to determine whether the current platform already has getline or not, and supply your own definition only when needed.

Example:

# 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)

or something along those lines, you'll have to adjust it to match your own program.

第几種人 2024-08-02 23:38:48

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

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

I'm not sure I've ever seen that specific definition of 'getline' here is the one I know of which uses c++ streams+strings.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文