2013-02-13 27 views
6

Lợi thế duy nhất tôi có thể nghĩ đến là tốc độ biên dịch. Kết quả cuối cùng (kích thước và tốc độ nhị phân) trong cả hai trường hợp phải giống nhau (trừ khi thư viện tĩnh được biên dịch mà không cần tối ưu hóa).Ưu điểm của việc sử dụng thư viện tĩnh được biên dịch trước bao gồm mã nguồn là gì?

Ngoài ra một số tham chiếu sẽ được đánh giá cao.

Cập nhật: Câu hỏi này xuất hiện khi chúng tôi phải bao gồm thư viện nguồn mở bên thứ ba nhỏ trong dự án của chúng tôi. Một nhà phát triển đã đưa ra một tuyên bố rằng bao gồm thư viện tĩnh biên dịch sẵn (thay vì chỉ sao chép các tệp nguồn) sẽ làm tăng hiệu suất của Ứng dụng. Tôi không thấy lý do tại sao điều này là đúng.

Vì vậy, câu hỏi đặt ra là: bao gồm thư viện được biên dịch trước có thực sự cải thiện hiệu suất của ứng dụng cuối cùng không?

Trả lời

3

Nếu bạn đang nói về thư viện của bên thứ ba, một số lợi ích của chúng là: không cần phải phát hành mã nguồn, (có khả năng) cài đặt đơn giản cho nhà phát triển cuối ... mặc dù đôi khi nó trở thành hơn một rắc rối, đặc biệt là nếu nó không được thực hiện đúng (liên kết trong các dự án mã nguồn mở khác mà không sửa các ký hiệu, kiến ​​trúc sai được hỗ trợ).

Nếu bạn chỉ là mã của riêng bạn - có vẻ như bạn đang tạo ra những cơn đau đầu cho chính mình. Nếu các tập tin không thay đổi, chúng sẽ được biên dịch trên đĩa đã có (.o), và trình biên dịch sẽ không cần phải xây dựng lại chúng trừ khi bạn làm sạch/xây dựng lại tất cả. Vì vậy, bạn có thể sẽ không đạt được tốc độ biên dịch.

Dù bằng cách nào - có, đầu ra phải giống nhau. Thư viện được liên kết tĩnh chỉ là một tập hợp các tệp .o giống như bạn đã liên kết trực tiếp.

EDIT:

Cụ thể giải quyết tốc độ của .o vs .a - .a chỉ đơn giản là một bộ sưu tập các tập tin .o để dễ đóng gói quá trình phát triển. Khi được liên kết, kết quả sẽ giống nhau. Tôi vừa làm một bài kiểm tra sanity nhanh để xác minh:

$ cat a.c 
#include <stdio.h> 

extern char *something(); 

int main() 
{ 
    printf("%s", something()); 
    return 0; 
} 
$ cat b.c 
char *something() 
{ 
    return "something fancy here\n";  
} 

$ gcc -c -o a.o a.c 
$ gcc -c -o b.o b.c 
$ gcc -o foo1 a.o b.o 
$ ar -r b.a b.o 
ar: creating archive b.a 
$ gcc -o foo2 a.o b.a 
$ cmp foo1 foo2 

Và ở đó bạn có nó, các tệp nhị phân giống hệt nhau bằng cách liên kết .o vs .a.

Có hiệu suất nhỏ nhấn nếu bạn sử dụng thư viện động thay vì thư viện tĩnh (tôi chỉ tin khi biểu tượng được tra cứu). Có lẽ đây là những gì các nhà phát triển khác đã đề cập đến, các thư viện tĩnh sẽ nhanh hơn một chút so với các thư viện động.

+0

Tôi đồng ý với quá nhiều câu trả lời này để tự trả lời. Nhưng chỉ muốn thêm rằng nó thực sự phụ thuộc vào bạn là ai và dự án là gì. Sở hữu công cụ, nơi bạn sở hữu nguồn và không phải lo lắng về việc chia sẻ, sau đó libs tĩnh là loại vô nghĩa và chỉ làm việc thêm cho không có lợi nhuận. Nếu bạn dự định phát hành cho người khác, thì chúng rất tuyệt vời để bảo vệ mã nguồn của bạn. Biên dịch sẵn và sẵn sàng để sử dụng. –

+0

Tôi đã cập nhật câu hỏi để hiển thị tốt hơn ngữ cảnh của nó. Theo như tôi hiểu một thư viện tĩnh là nhiều hay ít đầu ra thô của một trình biên dịch, do đó, ở giai đoạn liên kết, nó sẽ không tạo ra sự khác biệt cho dù nó liên kết với thư viện tĩnh hoặc các tệp .o được trình biên dịch tạo ra. – DexM

+0

câu trả lời được cập nhật để giải quyết câu hỏi được cập nhật của bạn. – escrafford

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