2017-09-08 24 views
5

Tôi đã xây dựng Clang với MinGW trên Windows với mục tiêu ba x86_64-w64-windows-gnu. Exe làm việc như mong đợi nếu tôi xây dựng chúng trong chế độ phát hành (họ biên dịch chương trình mà không có lỗi), tuy nhiên khi xây dựng trong chế độ gỡ lỗi tôi không thể chạy chúng và nhận được this error - "Ứng dụng này không thể chạy trên của bạn PC ". Các tệp thực thi khác từ cùng một bản dựng như clang-check.exe không hiển thị lỗi này và chạy đúng.Xây dựng gỡ lỗi của Clang được xây dựng với MinGW trên Windows 10 không thể chạy

Dường như đây có thể là vấn đề với kích thước tệp như clang.exe và clang ++. Exe có kích thước> 2GB trong khi các tệp thi hành khác nhỏ hơn nhưng tôi đã bị ấn tượng rằng giới hạn kích thước tệp là 64 -bit Windows là 4GB.

Có ai khác gặp sự cố tương tự không? Nếu kích thước tập tin là vấn đề, nó có thể để có được LLVM để đặt các biểu tượng gỡ lỗi trong một tập tin riêng biệt để giảm kích thước của thực thi?

EDIT: Tôi đã cố gắng giảm kích thước thực thi bằng cách bán các biểu tượng gỡ lỗi cho một tệp riêng biệt bằng cờ -gsplit-dwarf khi xây dựng LLVM nhưng nó không có hiệu lực.

Trả lời

4

Có, kích thước tệp là một gợi ý khá hay về sự cố này. IMAGE_OPTIONAL_HEADER64.SizeOfImage field là DWORD, đề xuất kích thước tối đa 4 GB. Nhưng có một giới hạn khác khởi động trước, trình tải hệ điều hành ánh xạ toàn bộ tệp .exe hoặc .dll vào bộ nhớ bằng tệp ánh xạ bộ nhớ. Chế độ xem trên MMF không bao giờ lớn hơn 2 GB. Đây là một giới hạn kỹ thuật khó, nó thậm chí còn áp dụng cho x64. Tìm hiểu thêm về vấn đề này trong this post.

Thông tin gỡ lỗi chắc chắn là lý do khiến tệp hình ảnh bị thổi quá nặng. Để so sánh, việc xây dựng clang được bao gồm trong VS2017 cần 27MB cho giao diện người dùng và 32MB cho kết thúc x64. Tại sao -gsplit lùn không thể giải quyết vấn đề của bạn có thể nhìn thấy từ this project page:

Fission được thực hiện trong GCC 4.7, và yêu cầu hỗ trợ từ phiên bản gần đây của objcopy và linker vàng.

MinGW không thể cung cấp cho bạn liên kết vàng. Họ không cố gắng chuyển nó vì nó chỉ có thể tạo ra hình ảnh ELF. Sự thật khó khăn lạnh, miễn là bạn phụ thuộc vào MinGW sau đó bạn đang lên một con lạch mà không có một mái chèo tốt.

Điều gì đó quyết liệt là cần thiết. Tôi sẽ do dự nhắc đến Cygwin. Hãy xem xét một trình biên dịch, như sử dụng Clang để xây dựng Clang :) hoặc MSVC++. Ấn bản cộng đồng là bản tải xuống miễn phí. Ngoài ra hãy chắc chắn để có một cái nhìn tại Clang port, họ đã làm rất nhiều công việc để làm cho nó ABI tương thích.

+0

Xin cảm ơn, bạn nên biết rằng giới hạn là do kích thước tệp và không phải là thứ gì khác. Bạn có biết liệu trình liên kết LLD có hỗ trợ tách các biểu tượng gỡ lỗi thành một tệp riêng biệt không? Tôi rất tiếc khi sử dụng MinGW để xây dựng Clang ban đầu khi tôi cần sử dụng các tiêu đề nguồn mở nhưng tôi có thể sử dụng LLD để liên kết khi xây dựng Clang với các biểu tượng gỡ lỗi bằng cách sử dụng cờ -DCMAKE_LINKER. – ed95

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