2009-10-25 73 views
6

以下問題在我的開源庫中彈出,我無法弄清楚發生了什麼。奇怪的gcc錯誤:程序中出現' NNN'

我的用戶有兩個看起來像(GCC)編譯器錯誤:

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

我無法重現這些錯誤;代碼在我測試過的所有機器上編譯得很好。

谷歌搜索似乎表明,這往往是一個奇怪的編碼或奇怪的格式化的結果,但我運行所有來源通過十六進制編輯器,並且所有字符是可打印ASCII(0x20 - 0x7E)或選項卡,或換行符。而已。

此外,兩個用戶都成功編譯了該庫的以前版本;但是從那時起,所討論的特定文件(regex.cpp)及其頭文件還沒有被修改!

請參閱here瞭解更多詳情,包括下載代碼的鏈接(如果需要)。但我會很高興只是一個可能的方向指針。

+0

請!閱讀軟件發佈HOWTO(http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html) - 你總是解壓的東西變成一個子目錄(YAML-CPP-0.2.3)和不要將你的代碼分散在當前目錄中......不要吝嗇! (好的:我應該知道的更好 - 但你也應該!) – 2009-10-25 17:33:33

+0

對不起,你是對的。我只是習慣以這種方式被別人搞砸,所以在解壓縮時總是會創建一個新的目錄。但是,對不起,我會在下次修復這個問題。感謝您的鏈接。 – 2009-10-25 17:38:57

+1

@Jesse:不要接受被別人用這種方式搞砸。容忍一次;指出他們對他們的方式錯誤,然後拒絕與不處理問題的軟件有更多的關係。 。 – 2009-10-25 18:11:38

回答

7

Baffe Boyois得到了正確的一般答案 - 您的CMake規則必須做得太多。

在MacOS X 10.5.8(Leopard)的,我得到:

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

你應該列出你需要編譯的文件;你不應該只編譯所有和雜項。

這個問題似乎是在的CMakeLists.txt:

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

無論是CMake的GLOB是有點太熱情了(我使用的是2.6版補丁4),或者你不能使用它,而任何的客戶正在使用MacOS X.

GLOB正在做什麼擴展以包含以'。'開頭的文件。是任何人的猜測;我傾向於把它視爲cmake中的一個bug。

然而,作爲一種解決方法,我編輯的CMakeLists.txt並得到了這個工作:

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

這不是完整的解決方案:我遇到的問題與在YAML代碼的延續閱讀器目錄。我以基本相同的方式修改了yaml-reader/CMakeLists.txt文件。

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

一個奇怪的細節 - 有的在 'src' 目錄中的文件沒有shadow文件。當我做「-tvf YAML-CPP-0.2.3.tar.gz焦油」,我看到的文件在隨源:

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

所以惡棍文件正在使用的產品tar文件發貨。你受到感染 - 不知道如何。

+0

創建[^] * CPP應該工作以及 – bdonlan 2009-10-25 17:51:15

+0

@bdonlan:是的,它的工作 - 但有多少源文件不要」。 t從字母字符開始?當然,如果任何文件都以大寫字母開頭,那麼您的符號更加緊湊。我仍然認爲有足夠的空間來爭辯cmake中存在一個bug - shell通配符不會擴展以匹配以點開頭的名稱,也不應該cmake。 – 2009-10-25 17:56:07

+0

好的。我覺得奇怪的是,以前的版本對他們來說編譯得很好。 「._whatever.cpp」生成的文件中有什麼? – 2009-10-25 17:59:16

0

可能是他們的一個損壞的文件。

THEIR系統上的_regex.cpp第一行是什麼。

如果出現下載/編碼問題,您必須查看系統文件中的內容,而不是代碼庫中的內容。

13

錯誤出現在._regex.cpp,而不是regex.cpp。盯着._的文件是由MacOS自動生成的。看起來你的編譯系統試圖編譯所有以.cpp結尾的文件。它可能不應該編譯任何以點開頭的東西。

+1

這些+文件由OSX在非HFS +鍵(Mac OS本機格式)文件系統 – Mark 2009-10-25 17:32:59

0

確保你只需要在你的build目錄.o文件。我有這個問題,原因是我的Makefile(實際上是一個scons文件)中的一個錯誤,它將一個源文件構建爲.c文件而不是.o文件。結果文件是一個二進制文件,但我假設gcc試圖將其解釋爲一個.c文件。

0

我只是有這種事發生與我讓我的C++程序。發生這種情況時,我從PDF文件,這是

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

我通過它是模運算複製雙散列的公式,但它竟然是編碼或東西,但我刪除它解決了這一併手動輸入。