getline на MacOSX 10.6 сбой компилятора C? - PullRequest
3 голосов
/ 12 ноября 2010

Мне очень трудно установить библиотеку R, требующую компиляции на C. Я использую компьютер Mac OSX Snow Leopard и пытаюсь установить этот пакет R ( здесь ).

Я смотрел на ветку , рассказывающую о getline на macs, и перепробовал некоторые из этих исправлений, но ничего не работает!Я новичок и не знаю C, так что может быть поэтому!Может кто-нибудь дать мне несколько советов о том, как я могу изменить файлы в этом пакете, чтобы заставить его установить ??Любая помощь будет с благодарностью оценена!Вот ошибка, которую я получаю:


** libs
** arch - i386
g++ -arch i386 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/i386  -I/usr/local/include   -D_FASTMAP -DMAQ_LONGREADS   -fPIC  -g -O2 -c bed2vector.C -o bed2vector.o
In file included from /usr/include/c++/4.2.1/backward/strstream:51,
                 from bed2vector.C:8:
/usr/include/c++/4.2.1/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
bed2vector.C: In function ‘int get_a_line(FILE*, BZFILE*, int, std::string&)’:
bed2vector.C:74: error: no matching function for call to ‘getline(char**, size_t*, FILE*&)’
make: *** [bed2vector.o] Error 1
chmod: /Library/Frameworks/R.framework/Resources/library/spp/libs/i386/*: No such file or directory
ERROR: compilation failed for package 'spp'

Ответы [ 2 ]

5 голосов
/ 12 ноября 2010

Самое простое решение - добавить статическое определение для getline() в bed2vector.c.Это может быть достаточно хорошо:

/* PASTE AT TOP OF FILE */
#include <stdio.h>   /* flockfile, getc_unlocked, funlockfile */
#include <stdlib.h>  /* malloc, realloc */

#include <errno.h>   /* errno */
#include <unistd.h>  /* ssize_t */

extern "C" ssize_t getline(char **lineptr, size_t *n, FILE *stream);

/* PASTE REMAINDER AT BOTTOM OF FILE */
ssize_t
getline(char **linep, size_t *np, FILE *stream)
{
  char *p = NULL;
  size_t i = 0;

  if (!linep || !np) {
    errno = EINVAL;
    return -1;
  }

  if (!(*linep) || !(*np)) {
    *np = 120;
    *linep = (char *)malloc(*np);
    if (!(*linep)) {
      return -1;
    }
  }

  flockfile(stream);

  p = *linep;
  for (int ch = 0; (ch = getc_unlocked(stream)) != EOF;) {
    if (i > *np) {
      /* Grow *linep. */
      size_t m = *np * 2;
      char *s = (char *)realloc(*linep, m);

      if (!s) {
        int error = errno;
        funlockfile(stream);
        errno = error;
        return -1;
      }

      *linep = s;
      *np = m;
    }

    p[i] = ch;
    if ('\n' == ch) break;
    i += 1;
  }
  funlockfile(stream);

  /* Null-terminate the string. */
  if (i > *np) {
    /* Grow *linep. */
      size_t m = *np * 2;
      char *s = (char *)realloc(*linep, m);

      if (!s) {
        return -1;
      }

      *linep = s;
      *np = m;
  }

  p[i + 1] = '\0';
  return ((i > 0)? i : -1);
}

Это не обрабатывает случай, когда строка длиннее максимального значения, которое может представлять ssize_t.Если вы столкнетесь с этим случаем, у вас, вероятно, возникнут другие проблемы.

0 голосов
/ 12 ноября 2010

Нулевой вопрос: Вы рассматривали возможность использования менеджера пакетов, например fink или MacPorts , вместо того, чтобы компилировать себя? Я знаю, что у fink есть пакет R.

Первый вопрос: Как управляется сборка R? Есть ли ./configure? Если это так, вы смотрели на варианты? Использует ли он make? Scons? Какой-то другой менеджер зависимостей?

Второй вопрос: Вы сказали системе сборки, что работаете на Mac? Можете ли вы указать, что у вас нет libc с собственным getline?

Если система сборки не поддерживает Mac OS - но я представляю, что это делает R - вам, вероятно, придется скачать автономную версию и взломать сборку, чтобы включить ее. Как именно вы это сделаете, зависит от системы сборки. И вам может понадобиться взломать источник.

...