2012-10-18 74 views
19

Tôi đang cố gắng để tạo ra một thư viện C++ trong Xcode và tôi không chắc chắn liệu có nên chọn C/Thư viện C++ hoặc STL C++ Library lựa chọn? Tôi nhận thấy rằng tùy chọn STL C++ Library không cho phép bạn tạo thư viện tĩnh và buộc bạn tạo thư viện động. Tuy nhiên, tùy chọn C/C++ Library cũng cho phép bạn tạo thư viện động ngoài việc tạo thư viện tĩnh.Sự khác nhau giữa Thư viện C/C++ và Thư viện STL C++ trong XCode là gì?

sự khác biệt giữa hai lựa chọn và khi nào tôi nên sử dụng mỗi này là gì? Tôi đọc các mô tả bên dưới các tùy chọn nhưng tiếc là chúng không hữu ích lắm.

Ngày lưu ý khác, tại sao là tĩnh thư viện tập tin khác nhau từ thư viện tập tin năng động ở tất cả? Dường như sự khác biệt chủ yếu trong cách thư viện được tìm thấy (được đóng gói với ứng dụng của bạn và dựa vào sự hiện diện trên máy đích), không phải trong chức năng hoặc mã của chính thư viện đó. Nó sẽ là tuyệt vời nếu ai đó có thể làm rõ điều này.

enter image description here

enter image description here

+0

libC++ vs libstdC++ có thể? – Praetorian

Trả lời

17

Một thư viện liên kết tĩnh không thể được nạp tại thời gian chạy nhưng phải được đưa vào tập tin nhị phân của bạn khi bạn liên kết thực thi của bạn. Điều này có nghĩa rằng tất cả các điểm vào mã trong thư viện liên kết tĩnh được xác định rõ và địa chỉ của chúng sẽ không thay đổi liên quan đến sự khởi đầu của mã thực thi của bạn (do đó "tĩnh").

Với thư viện được tải động, không có cách nào để biết mã sẽ ở đâu, vì vậy khi thư viện được tải vào thời gian chạy, cần có một lượng chi phí hiệu năng nhất định để "liên kết" mã đã tải. Về cơ bản, liên kết được hoãn lại cho thời gian chạy, đó là lý do tại sao nó cũng đôi khi được gọi là "ràng buộc muộn".

nào bạn chọn để thực hiện phụ thuộc vào yêu cầu sử dụng của bạn. Nếu bạn muốn một tập tin thực thi độc lập mà người dùng có thể chỉ cần kéo và thả vào thư mục ứng dụng của mình mà không phải lo lắng về các phụ thuộc, liên kết tĩnh các thư viện của bạn có thể là cách để đi.

Nhưng đối với các dự án có quy mô lớn hơn, trong các ứng dụng cung cấp một tấn các chức năng, nó có thể là quá cao và không cần thiết để tải tất cả các chức năng cùng một lúc. Việc cung cấp một bộ thư viện có thể tải động có thể vừa tiết kiệm bộ nhớ vừa rút ngắn thời gian khởi động. Sau đó, khi người dùng truy cập các tính năng, mã có liên quan được tải và các tính năng có thể chưa được sử dụng trong một thời gian có thể được tải xuống.

Ngoài ra, nếu bạn thực hiện thay đổi mã, bạn có thể chỉ cần phân phối lại một hoặc hai thư viện thay vì phải biên dịch lại và liên kết lại và phân phối lại toàn bộ tệp thực thi. Và tôi cần phải đề cập đến triển vọng của plugin?

Sự khác biệt giữa hai mẫu trên là tinh tế. Cả hai biên dịch C theo tiêu chuẩn GNU99. Nhưng mẫu C/C++ Library thiết lập xcode để biên dịch C++ theo chuẩn C++/GNU ++ 0x ". C++/GNU ++ 0x sau đó được chính thức công bố là C++/GNU ++ 11 vào năm 2011. Cả hai mẫu mặc định sử dụng libC++, nhưng STL C++ Template cho phép bạn chọn liên kết với libstdC++ cũ hơn. Tại sao bạn sẽ làm điều này? Nếu mã của bạn liên kết với libC++ nhưng bạn cũng đang liên kết với các thư viện khác tham chiếu libstdC++ và bạn chạy qua các ký hiệu mâu thuẫn, bạn có thể giải quyết vấn đề này bằng cách liên kết với libstdC++. Mẫu thư viện STL C++ cũng cho phép bạn yêu cầu trình biên dịch dính vào chuẩn C++ 11, không bao gồm phần mở rộng của GNU ++ 11, hoặc quay lại C++/GNU ++ 98 (nếu bạn cần biên dịch mã kế thừa, cho thí dụ).

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