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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top