2009-10-25 143 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; 

我通过它是模运算复制双散列的公式,但它竟然是编码或东西,但我删除它解决了这一并手动输入。