Domanda

Il seguente problema è emerso nella mia libreria open source e non riesco a capire cosa stia succedendo.

Due dei miei utenti hanno errori di compilatore (gcc) che sembrano:

/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 viene compilato correttamente 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 fonte attraverso un editor esadecimale e tutti i caratteri sono ASCII stampabili (0x20 - 0x7E) o tab, oppure nuova linea. Questo è tutto.

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

Consulta qui per maggiori dettagli, tra cui collegamenti per scaricare il codice, se lo si desidera. Ma sarei felice con solo un puntatore in una possibile direzione.

È stato utile?

Soluzione

Baffe Boyois ha la risposta generale giusta: le regole di 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
...

Dovresti elencare i file che devi compilare; non dovresti solo compilare tutto sommato.

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 CMake GLOB è un po 'troppo entusiasta (sto usando la versione 2.6-patch 4) o non puoi permetterti di usarlo mentre qualcuno dei tuoi clienti usa MacOS X.

Che cosa sta facendo l'espansione GLOB per includere i file che iniziano con '.' è la supposizione di chiunque; Sarei propenso a considerarlo come un bug in cmake.

Tuttavia, come soluzione alternativa, ho modificato CMakeLists.txt e ho fatto in modo che funzionasse:

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 directory yaml-reader. Ho modificato il file yaml-reader / CMakeLists.txt praticamente 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 dispari: 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 spediti con il sorgente:

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
...

Quindi i file erratint vengono spediti con il file tar del prodotto. Sei stato infettato da qualche parte - non so come.

Altri suggerimenti

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

Potrebbe essere un file corrotto da parte loro.

Cosa c'è sulla linea 1 di _regex.cpp sul LORO sistema.

Se si è verificato un problema di download / codifica, dovrai guardare cosa c'è nei file sul loro sistema, non cosa c'è nel tuo repository di codice.

Assicurati di avere solo file .o nella tua directory di build. Ho avuto questo problema e la causa era un errore nel mio Makefile (in realtà era un file scons) che creava un file sorgente in un file .c anziché in un file .o. Il file risultante era un file binario, ma suppongo che gcc abbia cercato di interpretarlo come un file .c.

L'ho appena accaduto con il mio programma c ++ che stavo realizzando. Ciò si è verificato quando ho copiato la formula per il doppio hashing da un file pdf, che era

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

Io attraverso di esso ero l'operatore modulo, ma si è rivelato essere la codifica o qualcosa del genere, ma l'ho risolto cancellandolo e digitandolo manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top