2009-10-25 34 views
6

Sự cố sau xuất hiện trong thư viện nguồn mở của tôi và tôi không thể hiểu được điều gì đang diễn ra.Lỗi gcc lạ: đi lạc ' NNN' trong chương trình

Hai trong số người dùng của tôi có (gcc) lỗi biên dịch mà hình như:

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

tôi không thể tái tạo các lỗi này; mã biên dịch tốt trên tất cả các máy tôi đã thử nghiệm.

Googling xung quanh dường như chỉ ra rằng điều này thường là kết quả của một mã lạ hoặc định dạng lạ, nhưng tôi chạy tất cả các nguồn thông qua một trình soạn thảo hex, và tất cả các ký tự có thể in ASCII (0x20 - 0x7E), hoặc tab, hoặc dòng mới. Đó là nó.

Ngoài ra, cả hai người dùng đã biên dịch thành công phiên bản thư viện trước đó; nhưng tệp cụ thể được đề cập (regex.cpp) và các tệp tiêu đề của nó chưa được sửa đổi kể từ thời điểm đó!

Vui lòng xem here để biết thêm chi tiết, bao gồm các liên kết để tải xuống mã nếu bạn muốn. Nhưng tôi sẽ hạnh phúc với chỉ một con trỏ theo một hướng có thể.

+0

Xin vui lòng !!! ĐỌC bản phát hành phần mềm HOWTO (http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html) - bạn luôn giải nén các công cụ vào một thư mục con (yaml-cpp-0.2.3) và không phân tán mã của bạn xung quanh thư mục hiện tại ... Chết tiệt! (OK: Tôi nên biết rõ hơn - nhưng bạn nên thế!) –

+0

Xin lỗi, bạn nói đúng. Tôi chỉ được sử dụng để nhận được hơi say bởi những người khác theo cách này mà tôi luôn luôn làm cho một thư mục mới anyways khi giải nén. Nhưng vâng, xin lỗi về điều đó, tôi sẽ sửa lỗi đó cho lần sau. Cảm ơn các liên kết, quá. –

+1

@Jesse: không chấp nhận bị làm say bởi những người khác theo cách này. Khoan dung nó một lần; chỉ ra lỗi của con đường của họ với họ, và sau đó từ chối để có bất cứ điều gì nhiều hơn để làm với phần mềm mà sẽ không đối phó với vấn đề. –

Trả lời

7

Baffe Boyois đã có câu trả lời chung đúng - quy tắc CMake của bạn phải hoạt động quá nhiều.

On MacOS X 10.5.8 (Leopard), tôi nhận được:

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

Bạn nên liệt kê các tập tin bạn cần biên soạn; bạn không nên chỉ biên dịch tất cả và lặt vặt.

Vấn đề có vẻ là trong CMakeLists.txt:

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

Hoặc là CMake GLOB là một chút quá nhiệt tình (Tôi đang sử dụng phiên bản 2,6-vá 4) hoặc bạn không thể đủ khả năng để sử dụng nó trong khi bất kỳ khách hàng của bạn đang sử dụng MacOS X.

GLOB đang làm gì để mở rộng để bao gồm các tệp bắt đầu bằng '.' là bất kỳ ai đoán; Tôi muốn có khuynh hướng coi nó như một lỗi trong cmake.

Tuy nhiên, như một cách giải quyết, tôi sửa CMakeLists.txt và nhận được để làm việc này:

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

Đây không phải là giải pháp hoàn chỉnh: Tôi chạy vào một sự tiếp nối của vấn đề với mã trong yaml thư mục -reader. Tôi đã sửa đổi tệp yaml-reader/CMakeLists.txt về cơ bản theo cùng một cách.

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

Một chi tiết kỳ lạ - một số các tập tin trong thư mục 'src' không có các tập tin shadow. Khi tôi làm 'tar -tvf yaml-cpp-0.2.3.tar.gz', tôi thấy các tập tin đang được vận chuyển bằng nguồn:

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

Vì vậy, các tập tin hư đang được vận chuyển với các tập tin tar sản phẩm. Bạn đã bị nhiễm một nơi nào đó - không chắc chắn như thế nào.

+0

[^.] *. Cpp nên hoạt động tốt – bdonlan

+0

@bdonlan: vâng, nó sẽ hoạt động - nhưng có bao nhiêu tệp nguồn don ' t bắt đầu với một ký tự chữ cái? Cấp, ký hiệu của bạn là nhỏ gọn hơn nếu bất kỳ tập tin bắt đầu với chữ hoa quá. Tôi vẫn nghĩ rằng có chỗ để tranh luận rằng có một lỗi trong cmake - vỏ globbing không mở rộng để phù hợp với tên bắt đầu với dấu chấm, và không nên cmake. –

+0

Rất thú vị. Điều gì có vẻ kì lạ đối với tôi là phiên bản trước đó đã biên soạn tốt cho họ. Có gì trong tệp '._whatever.cpp' được tạo? –

0

Có thể là tệp bị hỏng về phía họ.

Có gì trên dòng 1 của _regex.cpp trên hệ thống CỦA HỌ.

Nếu có vấn đề về tải xuống/mã hóa, bạn sẽ phải xem những gì có trong tệp trên hệ thống của họ, không có gì trong kho lưu trữ mã của bạn.

13

Lỗi nằm trong ._regex.cpp, không phải regex.cpp. Các tập tin nhìn chằm chằm với ._ được tự động phát hiện bởi MacOS. Có vẻ như hệ thống xây dựng của bạn sẽ cố gắng biên dịch tất cả các tệp kết thúc bằng .cpp. Nó có lẽ không nên biên dịch bất cứ điều gì bắt đầu với một dấu chấm.

+1

Những tệp này được tạo bởi OSX trên hệ thống tệp không phải là HFS + (định dạng gốc Mac OS) – Mark

0

Đảm bảo bạn chỉ có tệp .o trong thư mục bản dựng của mình. Tôi đã có vấn đề này và nguyên nhân là một lỗi trong Makefile của tôi (thực sự nó là một tập tin scons) đã xây dựng một tập tin nguồn vào một tập tin .c thay vì một tập tin .o. Tệp kết quả là một tệp nhị phân, nhưng tôi giả sử gcc cố gắng diễn giải tệp dưới dạng tệp .c.

0

Tôi chỉ có điều này xảy ra với chương trình C++ mà tôi đã tạo. Điều này xảy ra khi tôi sao chép công thức cho băm đôi từ một tập tin pdf, đó là

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

tôi qua nó là toán tử modulo, nhưng nó bật ra được mã hóa hoặc một cái gì đó, nhưng tôi giải quyết này bằng cách xóa nó và nhập thủ công.

Các vấn đề liên quan