Bạn muốn tiện ích mở rộng visibility attribute của GCC.
Thực tế, một cái gì đó như:
#define MODULE_VISIBILITY __attribute__ ((visibility ("hidden")))
#define PUBLIC_VISIBILITY __attribute__ ((visibility ("default")))
(Bạn có thể muốn #ifdef
macro trên, sử dụng một số thủ thuật cấu hình à la autoconf
và khác autotools; trên các hệ thống khác mà bạn sẽ chỉ có định nghĩa rỗng như #define PUBLIC_VISIBILITY /*empty*/
vv ...)
Sau đó, khai báo một biến:
int module_var MODULE_VISIBILITY;
hoặc một hàm
void module_function (int) MODULE_VISIBILITY;
Sau đó, bạn có thể sử dụng module_var
hoặc gọi module_function
bên trong thư viện chia sẻ của bạn, nhưng không phải bên ngoài.
Xem thêm tùy chọn tạo mã -fvisibility của GCC.
BTW, bạn cũng có thể biên dịch toàn bộ thư viện của mình với -Dsomeglobal=alongname3419a6
và sử dụng someglobal
như bình thường; để thực sự tìm thấy nó, người dùng của bạn sẽ cần phải chuyển cùng một định nghĩa tiền xử lý cho trình biên dịch và bạn có thể đặt tên alongname3419a6
ngẫu nhiên và không đủ khả năng để làm cho va chạm không thể xảy ra.
PS. Khả năng hiển thị này là cụ thể đối với GCC (và có thể là đối với thư viện được chia sẻ ELF chẳng hạn như trên Linux). Nó sẽ không hoạt động nếu không có GCC hoặc bên ngoài các thư viện được chia sẻ .... vì vậy là khá cụ thể cho Linux (ngay cả khi một số hệ thống khác, có lẽ Solaris với GCC, có nó). Có thể một số trình biên dịch khác (clang
từ LLVM) cũng có thể hỗ trợ trên Linux cho thư viện được chia sẻ (không phải là thư mục tĩnh).Trên thực tế, ẩn thực (đối với một số đơn vị biên dịch của một thư viện được chia sẻ) được thực hiện chủ yếu bởi trình liên kết (vì các thư viện chia sẻ ELF cho phép điều đó).
Nguồn
2013-03-15 14:42:22
Điều gì khiến bạn nghĩ rằng OP đang sử dụng GCC và tính di động mã đó không được mong muốn? – Lundin
Tôi đã nói đó là một phần mở rộng GCC. Tôi đã thêm một PS lặp đi lặp lại đó. –
Có bạn đã làm. Tôi nhận xét kể từ khi tôi không nghĩ rằng Stack tràn nên là một diễn đàn GCC, tất cả mọi người dường như ngầm giả sử GCC ngày nay. – Lundin