2009-10-25 9 views
6

Poniższy problem pojawił się w mojej bibliotece Open Source i nie mogę się zorientować, co się dzieje.Dziwny błąd gcc: zabłąkany " NNN" w programie

Dwóch moich użytkowników ma (GCC) błędów kompilatora, które wyglądają jak:

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

I nie można odtworzyć te błędy; kod kompiluje się dobrze na wszystkich testowanych komputerach.

Googling dookoła zdawał się wskazywać, że jest to często wynikiem dziwnego kodowania lub dziwnego formatowania, ale uruchomiłem całe źródło za pomocą edytora szesnastkowego, a wszystkie znaki są albo drukowanymi ASCII (0x20 - 0x7E), albo tabulatorem, lub nowa linia. to jest to!

Ponadto obaj użytkownicy pomyślnie skompilowali poprzednią wersję biblioteki; ale dany plik (regex.cpp) i jego pliki nagłówkowe nie zostały zmodyfikowane od tego czasu!

Więcej informacji, w tym linki do pobrania kodu, można uzyskać pod adresem here. Ale byłbym szczęśliwy z tylko wskazówką w możliwym kierunku.

+0

Proszę !!! PRZECZYTAJ Software Release HOWTO (http://pl.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html) - zawsze rozpakowujesz rzeczy do podkatalogu (yaml-cpp-0.2.3) i nie rozrzucaj kodu wokół bieżącego katalogu ... Cholera! (OK: powinienem wiedzieć lepiej - ale ty też powinieneś!) –

+0

Przepraszam, masz rację. Po prostu jestem tak przyzwyczajony do tego, że inni robią to tak, że zawsze rozpakowuję nowy katalog po rozpakowaniu. Ale tak, przepraszam za to, naprawię to na następny raz. Dzięki za link. –

+1

@Jesse: nie akceptuj bycia przykręcanym przez innych w ten sposób. Toleruj to raz; zwróć uwagę na błąd ich dróg do nich, a następnie odmawiaj czegoś więcej do oprogramowania, które nie poradzi sobie z problemem. –

Odpowiedz

7

Baffe Boyois ma prawidłową ogólną odpowiedź - twoje zasady CMake muszą robić zbyt wiele.

na MacOS X 10.5.8 (Leopard), otrzymuję:

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

Należy notować pliki potrzebne zestawiane; nie powinieneś po prostu kompilować wszystkich i różnych.

Problem wydaje się być w CMakeLists.txt:

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

Albo CUpewnij GLOB jest nieco zbyt entuzjastycznie (używam wersji 2.6 Patch 4) lub nie można sobie pozwolić, aby używać go podczas dowolny Twoi klienci używają MacOS X.

Co robi GLOB, rozszerzając o pliki zaczynające się od "." to czyjś domysł; Byłbym skłonny uważać to za błąd w cmake.

jednak, jako obejście, I edycja CMakeLists.txt i got to do pracy:

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

Nie jest to kompletne rozwiązanie: wpadłem na kontynuację problem z kodem w YAML -reader katalogu. Zmodyfikowałem plik yaml-reader/CMakeLists.txt w zasadzie w ten sam sposób.

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: 
$ 

Jeden dziwny szczegół - niektóre pliki w katalogu „źródło” nie mają pliki cienia. Kiedy robię „tar -tvf YAML-CPP-0.2.3.tar.gz”, widzę pliki są wysyłane ze źródła:

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

Więc miscreant pliki są wysyłane z pliku tar produkt. Zarażiłeś się gdzieś - nie wiesz jak.

+0

[^.] *. Cpp powinno również działać – bdonlan

+0

@bdonlan: tak, to by działało - ale ile plików źródłowych nie ma t zacząć od litery alfabetu? To prawda, że ​​twoja notacja jest bardziej zwarta, jeśli jakiekolwiek pliki zaczynają się od wielkich liter. Nadal uważam, że jest miejsce na argument, że jest błąd w cmake'u - globbing powłoki nie rozszerza się, aby dopasować nazwy zaczynające się od kropki, a także nie powinien cmake. –

+0

Ładny połów. Wydaje mi się dziwne, że poprzednia wersja była dla nich odpowiednia. Co zawiera plik "._whatever.cpp"? –

0

Może to być uszkodzony plik z ich strony.

Co to jest linia 1 _regex.cpp w ICH SYSTEMIE.

Jeśli wystąpił problem z pobieraniem/kodowaniem, należy sprawdzić, co znajduje się w plikach w ich systemie, a nie to, co znajduje się w repozytorium kodu.

13

Błędy są w ._regex.cpp, a nie regex.cpp. Pliki wpatrzone w numer ._ są generowane automatycznie przez system MacOS. Wygląda na to, że twój system kompilacji próbuje skompilować wszystkie pliki kończące się na .cpp. Prawdopodobnie nie powinien kompilować niczego począwszy od kropki.

+1

Te pliki. + Są tworzone przez OSX na systemie plików innym niż HFS + (system macierzysty Mac OS) – Mark

0

Upewnij się, że w katalogu budowania znajdują się tylko pliki. Miałem ten problem i przyczyną był błąd w moim Makefile (faktycznie był to plik scons), który zbudował jeden plik źródłowy do pliku .c zamiast pliku .o. Wynikowy plik był binarny, ale zakładam, że gcc próbował zinterpretować go jako plik .c.

0

Po prostu tak się stało z moim programem C++, który robiłem. Miało to miejsce, kiedy kopiowany wzór na podwójnym mieszaja z pliku pdf, który był

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

I przez to był operator modulo, ale okazało się, że kodowanie czy coś, ale postanowiłem to poprzez usunięcie go i ręcznie wpisując go.

Powiązane problemy