2010-11-11 38 views
3

J'ai vraiment du mal à installer une bibliothèque R qui nécessite une compilation en C. J'utilise une machine Mac OSX Snow Leopard et je tente d'installer ce paquet R (here).getline sur le compilateur C écrasant MacOSX 10.6?

J'ai regardé the thread en parlant de getline sur les macs et j'ai essayé quelques-uns de ces correctifs, mais rien ne fonctionne! Je suis un débutant et je ne connais pas de C, alors c'est peut-être pourquoi! Quelqu'un peut-il me donner quelques conseils sur la façon dont je pourrais modifier les fichiers dans ce paquet pour l'installer? Anyhelp serait pathétiquement apprécié! Voilà l'erreur que je reçois:


** 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' 

Répondre

0

Zeroth question: Avez-vous envisagé d'utiliser un gestionnaire de paquets comme fink ou MacPorts plutôt que de vous compiler? Je sais que fink a un paquet R.

Première question: Comment la version R est-elle gérée? Y a-t-il un ./configure? Si oui, avez-vous examiné les options? Utilise-t-il make? Scons? Un autre gestionnaire de dépendance?

Deuxième question: Avez-vous dit au système de construction que vous travaillez sur un Mac? Pouvez-vous spécifier que vous n'avez pas de libc avec getline natif? Si le système de compilation ne prend pas en charge Mac OS --- mais je l'image que R fait --- vous devrez probablement télécharger la version autonome, et pirater la construction pour l'inclure. Comment exactement vous faites cela dépend du système de construction. Et vous devrez peut-être pirater la source.

5

La solution la plus simple est probablement d'ajouter une définition statique pour getline() à bed2vector.c. Cela pourrait être assez bon:

/* 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); 
} 

Cela ne gère pas le cas où la ligne est supérieure à la valeur maximale que ssize_t peut représenter. Si vous rencontrez ce cas, vous avez probablement d'autres problèmes.

+0

MERCI MERCI MERCI !!!! cela a fonctionné et tout a finalement été installé! J'espère que cela fonctionne (en essayant maintenant!) – user505180

+1

Je suis très heureux que cela a fonctionné. Si mon message répond à votre question, vous devez cliquer sur la coche à gauche de celle-ci. Voir [la section "Comment poser des questions ici?"] (Http://stackoverflow.com/faq#howtoask) dans la [FAQ de StackOverflow] (http://stackoverflow.com/faq) pour plus d'informations. –