2013-10-27 22 views
8

EDIT2:non definito simbolo “toupper” in MacPorts GCC 4.7 OS-X Mavericks 10,9 C11

ecco un esempio del programma:

#include <stdio.h> 
#include <ctype.h> 
int main() 
{ 
    int i=0; 
    char str[]="Test String.\n"; 
    char c; 
    while (str[i]) 
    { 
    c=str[i]; 
    putchar (toupper(c)); 
    i++; 
    } 
    return 0; 
} 

1) clang:

clang++ -std=c++0x -stdlib=libc++ -lc++ main.cc -o main

compila bene.

2) g++-mp-4.8 -std=c++11 main.cc -o main dà:

Undefined symbols for architecture x86_64: 
    "toupper(int)", referenced from: 
     _main in ccWjHauc.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

3) g++-mp-4.8 main.cc -o main compilazioni!

qualsiasi idea cosa c'è di sbagliato nel setup?

==========

Qualcuno può aiutarmi a capire cosa è cambiato in GCC/macports/OS 10.9?

Avevo uno script di compilazione di alcune librerie di terze parti che funzionano su os 10.8. Recentemente ho aggiornato al nuovo osx (10.9) e gcc 4.7 da macports interrotto il collegamento. In particolare ho:

Undefined symbols for architecture x86_64: 
"isspace(int)", referenced from: 

Questo problema è molto simile a quello menzionato here per istype. Tuttavia sembra che isspace non sieda in libgcC++. Dylib.

Qualche idea cosa provare?

Edit1:

infatti, 4,8 risolto il problema con isspace, ma un altro a superficie - toupper:

Undefined symbols for architecture x86_64: 
    "toupper(int)", referenced from: ... 

Che cosa sta succedendo qui?!. È collegato al nuovo Xcode (5.0)?

+1

hai incluso l'intestazione ? – asalic

+0

sì, il problema è ancora lì. – Denis

+0

btw, a mio avviso, l'assenza dell'intestazione porterebbe a un errore di compilazione in contrasto con l'errore di collegamento – Denis

risposta

10

C'è una patch in http://trac.macports.org/ticket/41033 Ha risolto il mio problema. Devi solo patchare il file in /usr/include/sys/cdefs.h e sostituire

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) 

da

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) && !defined(__cplusplus) 

Buona fortuna.

+0

grazie mille per la risposta. Aspetterò un paio di giorni per vedere se la patch è stata adottata. – Denis

0

Ho letto gli errori di linker con Maverick per alcuni giorni. Il problema sembra emergere con determinati strumenti di cross linking che erano compatibili, ma più lunghi lo sono.

Hai provato a forzare tutti gli strumenti per utilizzare un tipo clang ++ o llvm-g ++?

4

La maggior parte degli articoli ctype.h sono dichiarati come definizioni in linea, quindi vengono espansi in fase di compilazione. Quando si compila senza -std=c++11, si espande per:

extern inline int 
toupper(int _c) 
{ 
     return (__toupper(_c)); 
} 

Quando si compila con -std=c++11, si espande per:

extern inline __attribute__((__gnu_inline__)) int 
toupper(int _c) 
{ 
     return (__toupper(_c)); 
} 

Per qualche ragione, g ++ è quindi scegliendo di ignorare la perfetta buona definizione che è presentato lì.

Sulla base del commento on this invalid bug, gcc sceglie di non ottimizzare il codice e di cercare la definizione in una delle librerie collegate.

Una soluzione sembra essere la compilazione con almeno l'ottimizzazione -O1, che evita il problema, ma è un vero rompicoglioni.

Ora, quando guardiamo le differenze nelle #defines tra non-C++ 11 e C++ 11, vediamo che abbiamo un # define in più:

$ touch x.cc 
$ g++-4.9 -dM -E x.cc | grep STD 
#define __STDC_HOSTED__ 1 
#define __STDC__ 1 
$ g++-4.9 -std=c++11 -dM -E x.cc | grep STD 
#define __STDC_HOSTED__ 1 
#define __GNUC_STDC_INLINE__ 1 
#define __STDC__ 1 

ed a causa di un pezzo di codice nel 10,9 SDK (usr/include/sys/cdefs.h), tutti coloro __DARWIN_CTYPE_TOP_inline in cytpe.h arrivare trasformato in __header_inline che vengono trasformati in extern __inline __attribute__((__gnu_inline__)) grazie a questo po 'di codice aggiuntivo:

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) 
# define __header_inline   extern __inline __attribute__((__gnu_inline__)) 

sembra colpo di testa di apple sta cercando di fare il cosa giusta, ma non hanno coperto tutte le loro basi. C'è another issue, che menziona un bug simile.