Tôi chỉ xem xét điều này và nghĩ rằng một số người khác có thể quan tâm đến những phát hiện của tôi.
Kết nối yếu với weak_import thực sự chỉ hoạt động tốt với thư viện động. Bạn có thể làm cho nó hoạt động với liên kết tĩnh (bằng cách xác định dynamic_lookup -undefined như đã đề xuất ở trên) nhưng đây không phải là một ý tưởng nóng. Nó có nghĩa là không có ký hiệu không xác định sẽ được phát hiện cho đến khi chạy. Đây là điều tôi sẽ tránh trong mã sản xuất, cá nhân.
Đây là một phiên Mac OS X Terminal cho thấy làm thế nào để làm cho nó hoạt:
Dưới đây là fc
int f(int n)
{
return n * 7;
}
Đây là whatnof.c
#include <stdio.h>
#include <stdlib.h>
extern int f (int) __attribute__((weak_import));
int main() {
if(f == NULL)
printf("what, no f?\n");
else
printf("f(8) is %d\n", f(8));
exit(0);
}
Thực hiện một thư viện động từ fc:
$ cc -dynamiclib -o f.dylib f.c
Biên dịch và liên kết với lib động, liệt kê các lib động.
$ cc -o whatnof whatnof.c f.dylib
$ otool -L whatnof
whatnof:
f.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
Run whatnof để xem những gì sẽ xảy ra:
$ whatnof
f(8) is 56
Bây giờ thay thế f.dylib với một thư viện rỗng (không có kí tự):
$ mv f.dylib f.dylib.real
$ touch null.c
$ cc -dynamiclib -o f.dylib null.c
Run cùng whatnof để xem những gì sẽ xảy ra:
$ whatnof
what, no f?
Ý tưởng cơ bản (hoặc "trường hợp sử dụng") cho weak_import là nó cho phép bạn liên kết chống lại một tập hợp các thư viện động (được chia sẻ), nhưng sau đó chạy cùng một mã với các phiên bản trước đó của cùng một thư viện. Bạn có thể kiểm tra các hàm so với NULL để xem chúng có được hỗ trợ trong thư viện động cụ thể mà mã hiện đang chạy không. Điều này có vẻ là một phần của mô hình phát triển cơ bản được hỗ trợ bởi Xcode. Tôi hy vọng ví dụ này hữu ích; nó đã giúp tâm trí tôi thoải mái về phần này của thiết kế Xcode.
'int __attribute __ ((yếu)) main() {...}' hoạt động tốt đối với tôi với gcc/Mac OS X, nhưng không biên dịch được với gcc/MinGW. :( – mcandre
điều này có thể là vấn đề: http://stackoverflow.com/questions/13089166/how-to-make-gcc-link-strong-symbol-in-static-library-to-overwittren-weak-symbol –