2009-10-25 20 views
6

Il seguente problema è apparso nella mia libreria open source e non riesco a capire cosa sta succedendo.Strano errore gcc: stray ' NNN' nel programma

Due dei miei utenti hanno (GCC) errori del compilatore che assomigliano:

/home/someone/Source/src/._regex.cpp:1:1: warning: null character(s) ignored 
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\5’ in program 
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\26’ in program 
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\7’ in program 
/home/someone/Source/src/._regex.cpp:1:5: warning: null character(s) ignored 
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\2’ in program 
... 

non riesco a riprodurre questi errori; il codice compila bene su tutte le macchine che ho testato.

Googling around sembrava indicare che questo è spesso il risultato di una strana codifica o di una strana formattazione, ma ho eseguito tutta la sorgente attraverso un editor esadecimale, e tutti i caratteri sono ASCII stampabili (0x20 - 0x7E) o tab, o newline. Questo è tutto.

Inoltre, entrambi gli utenti hanno compilato correttamente la versione precedente della libreria; ma il particolare file in questione (regex.cpp) e i suoi file di intestazione non sono stati modificati da quel momento!

Vedere here per ulteriori dettagli, inclusi i collegamenti per scaricare il codice, se lo si desidera. Ma sarei felice solo con un puntatore in una possibile direzione.

+0

Per favore !!! LEGGERE il Software Release HOWTO (http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html) - si scompatta sempre la roba in una sottodirectory (yaml-cpp-0.2.3) e non spargere il tuo codice nella directory corrente ... Dannazione! (OK: dovrei sapere meglio - ma anche tu dovresti!) –

+0

Scusa, hai ragione. Sono così abituato a essere fregato da altri in questo modo che faccio sempre una nuova directory comunque durante la decompressione. Ma sì, mi dispiace, lo aggiusterò per la prossima volta. Grazie anche per il collegamento. –

+1

@Jesse: non accettare di essere fregato da altri in questo modo. Tollera una volta; indicare l'errore dei loro modi per loro, e quindi rifiutare di avere qualcosa di più da fare con il software che non affronterà il problema. –

risposta

7

Baffe Boyois ha la risposta generale giusta: le tue regole CMake devono fare troppo.

su MacOS X 10.5.8 (Leopard), ottengo:

Osiris JL: cmake .. 
-- The C compiler identification is GNU 
-- The CXX compiler identification is GNU 
-- Check for working C compiler: /usr/bin/gcc 
-- Check for working C compiler: /usr/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /Users/jleffler/tmp/yaml-cpp-0.2.3/build 
Osiris JL: make 
Scanning dependencies of target yaml-cpp 
[ 2%] Building CXX object CMakeFiles/yaml-cpp.dir/src/._conversion.cpp.o 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:1: warning: null character(s) ignored 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\5’ in program 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\22’ in program 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\7’ in program 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:5: warning: null character(s) ignored 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\2’ in program 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:7: warning: null character(s) ignored 
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:17: warning: null character(s) ignored 
... 

Si dovrebbero inserire i file necessari compilati; non dovresti semplicemente compilare tutti quanti.

Il problema sembra essere in CMakeLists.txt:

file(GLOB public_headers include/*.h) 
file(GLOB private_headers src/*.h) 
file(GLOB sources src/*.cpp) 

O il CMake GLOB è un po 'troppo entusiasta (sto usando la versione 2.6-patch 4) o che non può permettersi di usarlo mentre ogni dei tuoi clienti utilizzano MacOS X.

Cosa sta facendo il GLOB in espansione per includere file che iniziano con "." è qualcuno che indovina; Sarei incline a considerarlo un bug in cmake.

Tuttavia, come una soluzione, ho modificato CMakeLists.txt e ottenuto questo al lavoro:

file(GLOB public_headers include/[a-z]*.h) 
file(GLOB private_headers src/[a-z]*.h) 
file(GLOB sources src/[a-z]*.cpp) 

Questa non è la soluzione completa: Mi sono imbattuto in una continuazione del problema con il codice nella yaml -reader directory. Ho modificato il file yaml-reader/CMakeLists.txt sostanzialmente nello stesso modo.

FWIW:

$ file ._* 
._conversion.cpp: AppleDouble encoded Macintosh file 
._exp.cpp:  AppleDouble encoded Macintosh file 
._map.cpp:  AppleDouble encoded Macintosh file 
._map.h:   AppleDouble encoded Macintosh file 
._node.cpp:  AppleDouble encoded Macintosh file 
._null.cpp:  AppleDouble encoded Macintosh file 
._ostream.cpp: AppleDouble encoded Macintosh file 
._parser.cpp:  AppleDouble encoded Macintosh file 
._regex.cpp:  AppleDouble encoded Macintosh file 
._regeximpl.h: AppleDouble encoded Macintosh file 
._scanner.cpp: AppleDouble encoded Macintosh file 
._scanner.h:  AppleDouble encoded Macintosh file 
._scanscalar.cpp: AppleDouble encoded Macintosh file 
._scanscalar.h: AppleDouble encoded Macintosh file 
._sequence.cpp: AppleDouble encoded Macintosh file 
._simplekey.cpp: AppleDouble encoded Macintosh file 
._stream.cpp:  AppleDouble encoded Macintosh file 
._token.h:  AppleDouble encoded Macintosh file 
$ odx ._con*.cpp 
0x0000: 00 05 16 07 00 02 00 00 4D 61 63 20 4F 53 20 58 ........Mac OS X 
0x0010: 20 20 20 20 20 20 20 20 00 02 00 00 00 09 00 00   ........ 
0x0020: 00 32 00 00 00 79 00 00 00 02 00 00 00 AB 00 00 .2...y.......... 
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
* 
0x0050: 00 00 00 00 41 54 54 52 00 3C E0 2B 00 00 00 AB ....ATTR.<.+.... 
0x0060: 00 00 00 9C 00 00 00 0F 00 00 00 00 00 00 00 00 ................ 
0x0070: 00 00 00 00 00 00 00 01 00 00 00 9C 00 00 00 0F ................ 
0x0080: 00 00 17 63 6F 6D 2E 61 70 70 6C 65 2E 54 65 78 ...com.apple.Tex 
0x0090: 74 45 6E 63 6F 64 69 6E 67 00 00 00 55 54 46 2D tEncoding...UTF- 
0x00A0: 38 3B 31 33 34 32 31 37 39 38 34     8;134217984 
0x00AB: 
$ 

Un dettaglio strano - alcuni dei file nella directory 'src' non hanno i file shadow. Quando faccio 'tar -tvf yaml-cpp-0.2.3.tar.gz', vedo i file che vengono forniti con la fonte:

Osiris JL: tar -tvf yaml-cpp-0.2.3.tar.gz 
drwxr-xr-x beder/staff  0 2009-10-22 15:13:52 ./ 
-rw-r--r-- beder/staff 1750 2009-10-22 15:09:05 ./CMakeLists.txt 
drwxr-xr-x beder/staff  0 2009-10-19 16:40:15 ./include/ 
-rw-r--r-- beder/staff  171 2009-09-06 13:41:54 ./include/._conversion.h 
-rw-r--r-- beder/staff 1118 2009-09-06 13:41:54 ./include/conversion.h 
-rw-r--r-- beder/staff  302 2009-07-29 15:25:23 ./include/crt.h 
-rw-r--r-- beder/staff 2254 2009-10-19 16:40:14 ./include/emitter.h 
-rw-r--r-- beder/staff 1660 2009-10-19 16:40:14 ./include/emittermanip.h 
-rw-r--r-- beder/staff  171 2009-08-18 22:07:22 ./include/._exceptions.h 
-rw-r--r-- beder/staff 5638 2009-08-18 22:07:22 ./include/exceptions.h 
-rw-r--r-- beder/staff  765 2009-07-29 15:25:23 ./include/iterator.h 
-rw-r--r-- beder/staff  444 2009-07-29 15:25:23 ./include/mark.h 
-rw-r--r-- beder/staff  171 2009-09-06 12:25:12 ./include/._node.h 
-rw-r--r-- beder/staff 3467 2009-09-06 12:25:12 ./include/node.h 
-rw-r--r-- beder/staff  171 2009-09-15 20:54:20 ./include/._nodeimpl.h 
... 
-rw-r--r-- beder/staff  171 2009-07-29 21:28:26 ./include/._yaml.h 
-rw-r--r-- beder/staff  321 2009-07-29 21:28:26 ./include/yaml.h 
-rw-r--r-- beder/staff  167 2009-09-05 16:01:06 ./._install.txt 
-rw-r--r-- beder/staff  652 2009-09-05 16:01:06 ./install.txt 
-rw-r--r-- beder/staff 1073 2009-05-29 19:31:21 ./license.txt 
drwxr-xr-x beder/staff  0 2009-10-22 14:49:11 ./src/ 
-rw-r--r-- beder/staff 1697 2009-08-24 16:28:46 ./src/aliascontent.cpp 
-rw-r--r-- beder/staff 1171 2009-08-24 16:28:46 ./src/aliascontent.h 
-rw-r--r-- beder/staff  112 2009-05-29 19:31:21 ./src/content.cpp 
-rw-r--r-- beder/staff 1557 2009-08-24 16:28:46 ./src/content.h 
-rw-r--r-- beder/staff  171 2009-09-06 13:31:56 ./src/._conversion.cpp 
-rw-r--r-- beder/staff 2027 2009-09-06 13:31:56 ./src/conversion.cpp 
... 

Così i file miscredenti vengono spediti con la scheda prodotto tar. Sei stato infettato da qualche parte - non so come.

+0

[^.] *. Cpp dovrebbe funzionare pure – bdonlan

+0

@bdonlan: sì, funzionerebbe - ma quanti file sorgenti don ' iniziare con un carattere alfabetico? Certo, la notazione è più compatta se anche i file iniziano con la maiuscola. Continuo a pensare che ci sia spazio per argomentare che c'è un bug in cmake - il globbing della shell non si espande per corrispondere ai nomi che iniziano con punto, e nessuno dei due dovrebbe cmake. –

+0

Bella cattura. Quello che mi sembra strano è che la versione precedente ha compilato bene per loro. Cosa c'è nei file '._whatever.cpp' generati? –

0

Potrebbe essere un file corrotto da parte loro.

Cosa c'è nella riga 1 di _regex.cpp sul sistema THEIR.

Se è presente un problema di download/codifica, è necessario esaminare i file presenti nel proprio sistema, non quelli presenti nel repository di codice.

13

Gli errori sono in ._regex.cpp, non regex.cpp. I file che iniziano con ._ vengono generati automaticamente da MacOS. Sembra che il tuo sistema di compilazione cerchi di compilare tutti i file che terminano con .cpp. Probabilmente non dovrebbe compilare nulla a partire da un punto.

+1

Questi file. + Sono creati da OSX su un filesystem non HFS + (formato Mac OS nativo) – Mark

0

Assicurarsi di avere solo file .o nella directory di costruzione. Ho avuto questo problema e la causa è stata un errore nel mio Makefile (in realtà era un file scons) che ha creato un file sorgente in un file .c invece di un file .o. Il file risultante era un file binario, ma suppongo che gcc abbia cercato di interpretarlo come un file .c.

0

Ho appena avuto questo problema con il mio programma C++ che stavo facendo. Questo è avvenuto quando ho copiato la formula per l'hashing doppio da un file pdf, che era

return (randomNumber % (tableSize - 2)) + 1; 

I attraverso era l'operatore modulo, ma si è rivelato essere la codifica o qualcosa, ma risolto questo eliminandolo e manualmente digitandolo.