2012-08-15 39 views
11

Tôi đã cố gắng biên dịch Qt trên Windows và tôi đã gặp phải một vấn đề thú vị với #includes không có lỗi mà tệp được bao gồm không tồn tại ("Không có tệp nào hoặc danh mục"). Tuy nhiên tập tin không tồn tại. Các tập tin làm bao gồm là các tập tin tự động tạo ra "moc" (do Qt) có một bao gồm như sau:Visual Studio C++ bao gồm chuỗi dài tối đa

#include "../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

các chuỗi trong đó bao gồm có chiều dài 127 ký tự. Có rất nhiều tệp "moc" được tạo và biên dịch trong bản dựng, nhưng chỉ những tệp có độ dài rất dài như thế này (127 ký tự) không thành công.

Các tệp đang đề cập đến xảy ra khi đang ngồi trên hệ thống UNIX, được chia sẻ qua Samba với Windows. Tôi đã có thể giải quyết vấn đề bằng cách tạo một liên kết tượng trưng và thay thế "qt-everywhere-opensource-src-4.8.2" bằng "qt-4.8.2" trong các tệp bị ảnh hưởng. Kết quả bao gồm:

#include "../../../../../../../../qt-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

chỉ dài 102 ký tự và làm việc tốt.

Tôi đã tìm kiếm xung quanh và không thể tìm thấy bất kỳ tham chiếu nào về điều này. Tôi cũng không thể sao chép vấn đề bên ngoài bản xây dựng Qt này (chỉ cần tạo các tên tệp dài tùy ý và cố gắng đưa chúng vào). Vì vậy, có thể bằng cách nào đó các makefiles nmake mà Qt tạo ra đang làm một cái gì đó khi chúng chạy cl làm cho nó từ chối lâu bao gồm một cách nào đó.

Có ai có bất kỳ thông tin bổ sung nào về điều này không?

+0

chiều dài của đường dẫn tuyệt đối trong cả hai trường hợp là bao nhiêu? tức là khi giải quyết sự khác biệt ../../. Có giới hạn đường dẫn tối đa là 256 ký tự trên hầu hết các hệ thống cửa sổ cũ. – TemplateRex

+0

Đường dẫn đầy đủ cho ví dụ này là 132 và 106 ký tự, tương ứng. Nhưng hệ điều hành không gặp sự cố khi mở tệp (ví dụ: trong Notepad hoặc trình bao cmd). btw, tôi quên đề cập đến tôi đang sử dụng MSVS 2008. –

+0

Tôi đã sử dụng gắn kết Samba khi tôi không thể tái tạo sự cố. Dựa trên một số ý kiến ​​khác tôi tìm thấy trực tuyến Tôi nghĩ rằng nó có thể là chiều dài thư mục không phải là chiều dài tập tin, vì vậy tôi đã thực hiện một số thư mục giả thực sự dài, nhưng vẫn không có vấn đề. Nhưng sau đó tôi đã thử đưa tập tin nguồn vào thư mục dài và bao gồm ../../really-long-dir/7890123...890/a.h và tôi đã nhận được lỗi. Điều đó xảy ra với khoảng 131 ký tự. Nhưng tôi có thể có tổng chiều dài đường dẫn dài hơn với ít ".." trong đường dẫn. Rất kì lạ. Tôi tự hỏi nếu đây là một lỗi trong preprocessor. –

Trả lời

1

Vì điều này được sử dụng để tìm tệp được bao gồm, tôi có xu hướng tin rằng nó được kết nối với giới hạn đường dẫn tệp của hệ điều hành.

Có lẽ việc triển khai bộ tiền xử lý bằng cách nào đó cũng hạn chế nó, nhưng điều đó sẽ cụ thể cho từng trình biên dịch.

0

Tại một trong những nơi làm việc của tôi trong quá khứ, chúng tôi đã gặp phải một vấn đề tương tự khác. Dự án rất lớn và có rất nhiều tệp mà lệnh trình biên dịch Visual Studio tạo ra khi xây dựng dự án quá lâu đến nỗi nó vượt quá giới hạn và biên dịch không thành công. Điều này, tuy nhiên, đã xảy ra trên Visual Studio 2008, tôi không biết về những cái mới hơn.

Tôi biết nó không liên quan nhưng đây chỉ là thông tin bổ sung. Nó có thể giúp ai đó.

0

Có thể có giới hạn được đặt bởi khung .NET nhưng chưa tìm thấy dòng chính xác về điều này.

Dưới đây là một số liên kết thú vị về điều này: trên social msdnblog msdn.

0

Tôi đã gặp sự cố tương tự khi xây dựng các dự án sử dụng GCC trên cửa sổ. Vấn đề này dường như liên quan đến cách thức mà con đường được lắp ráp,

../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

trở thành

c:/some/working/structure/that_is/at_least/as_deep/as_the_up/levels/are/../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

(ví dụ có thể không mở rộng quy mô, tôi không đếm ký tự. ..)
Tại thời điểm này, xử lý đường dẫn bị hỏng do quá dài.Trong trường hợp của chúng tôi, buộc các trình biên dịch sử dụng một phiên bản hợp đồng,

c:/some/qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

sẽ làm cho vấn đề biến mất.
MSDN có chứa một số gợi ý của sự cố tại http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx
Lưu ý rằng định dạng thay thế, hỗ trợ dài hơn, đường dẫn, \? \, Dường như không hỗ trợ đường dẫn tương đối.

Sửa nhanh: Không sử dụng đường dẫn tương đối có độ sâu như vậy.

0

Bạn chỉ nên thêm đường dẫn mà bạn đang quan tâm đến tùy chọn trình biên dịch, thay vì sử dụng thứ gì đó khủng khiếp.

+0

Cả hai makefile và bao gồm trong câu hỏi được autogenerated bởi hệ thống xây dựng Qt. Tôi đã kiểm soát giới hạn đối với họ. May mắn thay, đây là một lần xây dựng, không phải cái gì tôi làm mỗi ngày. –

0

Chọn tab 'project' và bỏ chọn 'Shadow build' đã giải quyết được sự cố của tôi.

0

tôi đã gặp chính xác cùng một vấn đề gần đây, khi xây dựng qt trên các cửa sổ bằng cách sử dụng msys & mingw. Hệ thống xây dựng không thể tìm thấy tệp tiêu đề được bao gồm qua đường dẫn tương đối sau:

"../../../../../../../qt-everywhere-opensource-src- 5.0.1/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h "

Nhưng tệp đã có mặt và đường dẫn cũng chính xác.

Tôi đã tạo cấu trúc tệp tương tự bên ngoài cây nguồn qt và có thể tạo lại vấn đề bằng g ++ từ dòng lệnh.

Tôi đã sửa đổi một chút, bằng cách giảm từng ký tự tên tệp một. Năm ký tự xuống và các lỗi biến mất. g ++ đột nhiên tìm thấy tệp.

Đã hoạt động khi tổng số ký tự trong câu lệnh bao gồm bằng . Đây chỉ là một con số định lượng để đưa ra một ý tưởng sơ bộ những gì có thể là giới hạn dưới mui xe. Nó có thể khác nhau cho các phiên bản khác nhau của trình biên dịch. Tôi không nghĩ rằng hệ điều hành có bất kỳ phần nào trong việc xác định nó. Nút cổ chai này có vẻ nhiều hơn do tiền xử lý.

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