Strange gcc error: perdida '\ NNN' en el programa
-
06-07-2019 - |
Pregunta
El siguiente problema apareció en mi biblioteca de código abierto, y no puedo averiguar qué está pasando.
Dos de mis usuarios tienen (gcc) errores de compilación que se parecen a:
/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
...
No puedo reproducir estos errores; el código se compila bien en todas las máquinas que he probado.
El buscar en Google parecía indicar que esto suele ser el resultado de una codificación extraña o un formato extraño, pero ejecuté toda la fuente a través de un editor hexadecimal, y todos los caracteres son ASCII (0x20 - 0x7E) imprimibles, o tabulador, o nueva línea. Eso es todo.
Además, ambos usuarios compilaron con éxito la versión anterior de la biblioteca; ¡pero el archivo en cuestión ( regex.cpp
) y sus archivos de encabezado no se han modificado desde entonces!
Consulte aquí para obtener más información, incluido Enlaces para descargar el código si lo desea. Pero estaría feliz con solo un puntero en una posible dirección.
Solución
Baffe Boyois tiene la respuesta general correcta: las reglas de CMake deben estar haciendo demasiado.
En MacOS X 10.5.8 (Leopard), obtengo:
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
...
Debes listar los archivos que necesitas compilar; No solo debes compilar todos y cada uno.
El problema parece estar en CMakeLists.txt:
file(GLOB public_headers include/*.h)
file(GLOB private_headers src/*.h)
file(GLOB sources src/*.cpp)
O el CMake GLOB es un poco demasiado entusiasta (estoy usando la versión 2.6-patch 4) o no puede permitirse usarlo mientras cualquiera de sus clientes está usando MacOS X.
Lo que está haciendo el GLOB expandiéndose para incluir archivos que comienzan con '.' alguien lo adivina; Me inclino a considerarlo como un error en cmake.
Sin embargo, como solución alternativa, edité CMakeLists.txt y conseguí que esto funcionara:
file(GLOB public_headers include/[a-z]*.h)
file(GLOB private_headers src/[a-z]*.h)
file(GLOB sources src/[a-z]*.cpp)
Esta no es la solución completa: me encontré con una continuación del problema con el código en el directorio yaml-reader. Modifiqué el archivo yaml-reader / CMakeLists.txt básicamente de la misma manera.
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 detalle extraño: algunos de los archivos en el directorio 'src' no tienen los archivos ocultos. Cuando hago 'tar -tvf yaml-cpp-0.2.3.tar.gz', veo que los archivos se envían con la fuente:
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
...
Por lo tanto, los archivos miscreant se envían con el archivo tar del producto. Te infectaste en algún lugar, no estoy seguro de cómo.
Otros consejos
Los errores están en ._regex.cpp
, no en regex.cpp
. Los archivos que comienzan con ._
son generados automáticamente por MacOS. Parece que su sistema de compilación intenta compilar todos los archivos que terminan con .cpp. Probablemente no debería compilar nada que comience con un punto.
Podría ser un archivo dañado de su parte.
Lo que está en la línea 1 de _regex.cpp en el sistema THEIR.
Si hubo un problema de descarga / codificación, tendrá que ver qué hay en los archivos de su sistema, no qué hay en su repositorio de código.
Asegúrese de que solo tenga archivos .o en el directorio de compilación. Tuve este problema y la causa fue un error en mi Makefile (en realidad era un archivo scons) que generó un archivo fuente en un archivo .c en lugar de un archivo .o. El archivo resultante era un binario, pero supongo que gcc intentó interpretarlo como un archivo .c.
Acabo de pasar esto con mi programa c ++ que estaba haciendo. Esto ocurrió cuando copié la fórmula para el hashing doble de un archivo pdf, que era
return (randomNumber % (tableSize - 2)) + 1;
A través de él era el operador de módulo, pero resultó ser la codificación o algo así, pero lo resolví eliminándolo y escribiéndolo manualmente.