2012-06-05 35 views
7

Tôi đã tìm cụm từ này "xuất khẩu biểu tượng". Việc xuất khẩu một biểu tượng có ý nghĩa gì trong C/C++ hoặc đối với các thư viện (được chia sẻ/tĩnh)? Từ đâu chúng ta xuất khẩu các biểu tượng và tại sao? Mối quan hệ của việc xuất khẩu một biểu tượng với tên mangling bởi trình biên dịch là gì?Ý nghĩa của việc xuất khẩu một biểu tượng là gì?

+0

tìm _declspec (dllimport/export), tôi chắc chắn bạn có thể tìm thấy các giải thích tuyệt vời. –

+2

Ngoài ra, câu hỏi đã không được bình chọn vì nó là bản sao, nhưng có lẽ vì bạn đã được đề xuất bởi SO của các bản sao và bạn bỏ qua các đề xuất. –

+1

Tại sao nó là ngoại tuyến? – littleadv

Trả lời

16

Xuất biểu tượng có nghĩa là "quảng cáo" sự tồn tại của nó trong tệp/thư viện đối tượng của bạn và vị trí của nó, để các mô-đun khác có thể nhập (= liên kết đến).

Liên kết có thể được thực hiện tĩnh hoặc động, nhưng cách liên kết phải biết biểu tượng là gì và nó ở đâu và biểu tượng đã xuất và ký hiệu đã nhập phải khớp với nó. Tên mangling có liên quan đến điều đó (C++ mangling tên bao gồm định nghĩa loại biểu tượng trong tên biểu tượng, và mangling của biểu tượng xuất khẩu và nhập khẩu phải phù hợp cho các mối liên kết để liên kết xuất nhập khẩu một cách chính xác).


Ví dụ:

Giả sử bạn có một thư viện "STANDARDC" (tên ngẫu nhiên) và SOMEPROG chương trình của bạn. Chương trình SOMEPROG cần in trên bảng điều khiển, vì vậy nó sẽ gọi printf. Nhưng bạn không thực sự thực hiện printf trong chương trình SOMEPROG của bạn, bạn chỉ cần sử dụng nó (= nhập nó), trong khi thực hiện là ở nơi khác.

Thư viện STANDARDC có danh sách các ký hiệu mà nó xuất bao gồm tất cả các hàm được triển khai trong thư viện đó và có thể được gọi từ bên ngoài (= chức năng được xuất). printf là một trong những chức năng như vậy, do đó, nó sẽ xuất hiện trong danh sách xuất khẩu.

Trình biên dịch đi qua SOMEPROG.C của bạn và thấy rằng bạn tham chiếu printf, nhưng không có triển khai cho nó. Trình biên dịch thêm printf vào danh sách các biểu tượng đã nhập cho kết quả SOMEPROG.obj, để trình liên kết liên kết việc triển khai thực tế.

Trình liên kết sẽ lấy tệp SOMEPROG.obj của bạn và tệp STANDARDC .lib và thấy những hàm nào được sử dụng trong SOMEPROG.obj. Trình liên kết phát hiện rằng printf không được triển khai, nó được nhập, do đó trình liên kết xem qua tất cả các tệp .lib mà nó có và tìm thấy phù hợp với printf trong danh sách được xuất của STANDARDC. Việc thực hiện printf từ STANDARDC và liên kết nó với chương trình của bạn ở mọi nơi bạn tham chiếu biểu tượng được nhập printf.

+1

bạn có thể giải thích bằng ví dụ này. Tại sao tôi muốn xuất biểu tượng của mình? – Raulp

+1

@softy đã thêm một ví dụ. – littleadv

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