2010-07-26 43 views
7

Tôi có một thư viện tĩnh được biên dịch C++ gồm khoảng 15 lớp và các hàm và thành phần của chúng, và được biên dịch, nó gần 14 megabyte. Nó liên kết với thư viện bảng băm dày đặc của Google và MPIR, giống như GMP cho Windows, nhưng tôi đã làm điều đó trong một exe đơn giản và nó là một vài kilobyte. Tại sao nó quá lớn? Tôi có thể làm gì để giảm kích thước của nó? Có vẻ như có những chương trình khác phức tạp hơn tôi nhiều.Tại sao thư viện tĩnh của tôi quá lớn?

Biên soạn với Visual C++, dòng lệnh là:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" 
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t 
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\" 
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue 
+0

Bạn có thể cung cấp thêm thông tin cụ thể không? Biên dịch, biên dịch cờ, vv – Dusty

+0

Biên dịch với Visual C++, dòng lệnh là: /Zi/nologo/W3/WX-/O2/Oi/Oy-/GL/D "WIN32"/D "NDEBUG"/D "_CONSOLE "/ D" _UNICODE "/ D" UNICODE "/ Gm-/EHsc/GS/Gy/fp: chính xác/Zc: wchar_t/Zc: forScope /Fp"Release\ang.pch"/Fa "Release \"/Fo " Phát hành \ "/Fd"Release\vc100.pdb"/Gd/analysis-/errorReport: hàng đợi – Foglio

+0

Dòng lệnh *, không phải cờ. – Foglio

Trả lời

16

Thư viện tĩnh là một định dạng khác nhau đáng kể thành nhị phân; một phần vì nó có khá nhiều thông tin hơn. Về cơ bản, thư viện tĩnh hoạt động như một tệp ZIP của tất cả các tệp .obj được tạo từ các đơn vị dịch của bạn. Điều này cho phép trình liên kết đưa ra các chức năng không sử dụng, và nếu bạn đang sử dụng LTCG, nó cho phép inliner thực hiện các quyết định chéo mô-đun và các tối ưu hóa khác.

Ngoài ra, một số chế độ biên dịch sẽ nhúng các ký hiệu gỡ lỗi trực tiếp vào .lib, loại bỏ nhu cầu tệp .pdb riêng biệt.

Thông thường, bạn không cần phải lo lắng về kích thước thư viện tĩnh; trình liên kết sẽ ném tất cả thông tin bổ sung khi xây dựng tệp thực thi cuối cùng.

+0

Trình liên kết cũng đưa ra mã dự phòng và mã chết, v.v. – greyfade

+0

@greyfade: Thực ra trình biên dịch thực hiện điều đó;) –

+0

@Billy Oneal: Tại * liên kết time *? – greyfade

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