2011-02-03 38 views
5

Tôi đã vấp phải một vấn đề dường như đơn giản trong khi xây dựng hai thư viện và các chương trình thử nghiệm cho cả hai.Phụ thuộc transitive cho các thư viện tĩnh và SCON

Vấn đề: Tôi có hai thư viện tĩnh, libA và libB và libB phụ thuộc vào libA. Tôi không muốn liên kết một cách rõ ràng tất cả các chương trình sử dụng libB cho libA, tôi muốn SCons thấy rằng nếu một chương trình liên kết đến thư viện B thì nó cũng nên liên kết đến thư viện A.

Tôi đã tạo một ví dụ đơn giản minh họa vấn đề này. Vì tôi không thể tìm thấy một file hoster phù hợp và điều này được lập trình liên quan, tôi đã tạo ra một kho SVN nhỏ:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository 

hoặc bạn có thể tải về một tarball here.

Trả lời

4

Các SCON không được hỗ trợ để thể hiện các phụ thuộc thư viện transitive như bạn mô tả, nhưng người anh em họ của nó là Waf. Xem documentation để biết tính năng "sử dụng" trong sách Waf. Boost build system cũng có tính năng này under a different name. Bạn cũng có thể tự mình thực hiện điều này trong SCons nếu bạn sẵn sàng viết mã một chút Python.

Một mẹo bạn có thể sử dụng là khả năng xác định callbacks dưới dạng biến xây dựng (ví dụ: chuỗi sẽ được mở rộng thông qua cuộc gọi hàm Python). Có chức năng gọi tính toán danh sách các thư viện mà bạn cần dựa trên một số biểu đồ phụ thuộc mà bạn tính toán tại thời gian phân tích cú pháp (tức là thông qua các cuộc gọi phương thức được tìm thấy trong Bản ghi), và bạn sẽ không phải lặp lại danh sách đầy đủ các thư viện cho mọi mục tiêu hoặc môi trường.

+0

+1 liên kết thú vị! Tôi sẽ kiểm tra hướng dẫn waf, nhưng từ những gì tôi thấy, đây có thể là một lựa chọn tốt. Mặt khác, tôi đã bắt đầu triển khai một số trình xây dựng tùy chỉnh với SCON ... – hochl

+0

Giải pháp hiện tại của tôi xây dựng biểu đồ phụ thuộc dựa trên các tệp cấu hình phụ có chứa thông tin phụ thuộc vì tôi không tìm thấy cách nào khác để nhận phụ thuộc giữa xây dựng mục tiêu động. – hochl

0

libB và libA là gì? Có phải chúng là một trong những tệp .o hoặc chúng được tạo thành từ nhiều tệp .o không?

Nếu libs là nhiều tệp .o và bạn đang gọi một hàm trong một trong các tệp .o của libB sử dụng một trong các tệp .o của libA, thì bạn sẽ có lib .'s lib và. Nếu bạn đang sử dụng một hàm trong libB .o không phụ thuộc vào bất kỳ thứ gì từ libA, thì bạn chỉ nhận được tệp libB .o trong tệp nhị phân của mình.

Vì vậy, nếu bạn có lệnh:

cc -o a.out a.c libA.a libB.a 

Bạn sẽ chỉ nhận được những phần cần thiết từ cả hai libB và Liba.

+0

Chúng chỉ chứa các tệp đối tượng đơn giản, như có thể thấy trong ví dụ về tarball (xem liên kết ở cuối bài đăng). – hochl

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