2010-02-07 46 views
6

Tôi đã có một dự án làm việc trên đó là sử dụng FreeImage và openCV, hiện tại chúng tôi đang sử dụng hỗ trợ jpeg từ cả hai (tôi đang làm việc hướng tới việc sửa lỗi đó, nhưng bây giờ nó phải ở lại). Nhưng dù sao, FreeImage biên dịch libjpeg 7.0 thành các thư viện tĩnh của nó, và thư viện highgui của openCV liên kết nó như một thư viện chia sẻ (trên hệ thống của tôi, Ubuntu 9, tôi đã cài đặt libjpeg 6.2).Xung đột biểu tượng thư viện tĩnh và chia sẻ?

Chúng liên kết thành thư viện cuối cùng được sử dụng để liên kết với các chương trình khác nhau, trình bao bọc java, v.v. Tất cả đều hoạt động tốt, không có xung đột biểu tượng hoặc bất kỳ điều gì trong thời gian biên dịch/liên kết. Tuy nhiên, khi tôi mở một hình ảnh bằng cách sử dụng hàm cvLoadImage của openCV, nó sẽ chết khi đọc tiêu đề, rất có thể do sự khác biệt giữa các tiêu đề trong 6.2 và 7.0.

Nếu tôi hủy liên kết FreeImage (và nhận xét mã yêu cầu), cuộc gọi openCV bắt đầu hoạt động trở lại, vì vậy rõ ràng các ký hiệu libjpeg tĩnh từ FreeImage đang xung đột với các biểu tượng sẽ được tải từ thư viện được chia sẻ libjpeg. Những gì tôi không thể tìm ra là lý do tại sao trình biên dịch của tôi không phải là ném một lỗi trong quá trình liên kết vì hai bộ biểu tượng libjpeg. Ngoài ra, tôi đã thử thay thế tiêu đề jpeglib.h của hệ thống của tôi bằng phiên bản 7.0 tạm thời để xem openCV có được đồng bộ hóa với các ký hiệu tự do mang đến bảng hay không.

Cuối cùng tôi đặt printf vào jpeg_read_header trong libjpeg để biên dịch tự do, và xây dựng lại nó để xem openCV có sử dụng định nghĩa libjpeg tự do hay không. Nó không in ra nên tôi phải giả định là không.

Vì vậy, tôi đoán câu hỏi của tôi là

1) Tại sao không liên kết một libjpeg tĩnh và libjpeg chia sẻ tạo ra lỗi liên kết do lặp lại biểu tượng?

2) Có ai biết tại sao hai điều này xung đột với nhau không?

Chỉnh sửa: Biên dịch openCV ở chế độ gỡ lỗi và sau đó ở chế độ thông thường một lần nữa có vẻ đã đánh mất thứ gì đó và khiến nó hoạt động trở lại, không biết chuyện gì đang diễn ra.

Trả lời

1

nó giống như thế này

Thư viện tĩnh được biên dịch trong, thư viện động được tải trong thời gian chạy, nhưng chỉ những biểu tượng bị thiếu (tôi nghĩ). bạn có thể biên dịch các thư viện được chia sẻ, và sau đó bạn có thể nhận được va chạm biểu tượng.

vì vậy opencv sử dụng các biểu tượng được biên dịch, vì chúng đã xuất hiện, thay vì các biểu tượng từ thư viện động. bạn kết thúc bằng cách sử dụng các ký hiệu tĩnh, có thể với các chữ ký khác nhau, từ triển vọng của opencv.

+0

Giả định của tôi là nó sử dụng một hoặc thư viện khác, nhưng có lẽ nó sử dụng một chút bằng cả hai cách nào đó? Thay đổi tiêu đề mà openCV biên dịch với không khắc phục được vấn đề sau khi tất cả .. –

1

Nói chung trình liên kết là tốt về việc chuyển nhiều thư viện mà tất cả đều giải quyết (các) biểu tượng giống nhau. Nó chỉ sử dụng cái đầu tiên mà nó tìm thấy. Thứ tự của các thư viện trên dòng lệnh linker của bạn sẽ xác định thứ tự "thắng".

Điều này, bằng cách này, KHÔNG đúng đối với các tệp đối tượng. Mỗi trình liên kết tôi từng sử dụng giả định rằng bạn muốn để sử dụng tất cả các đối tượng bạn chỉ định và sẽ khiếu nại nếu có nhiều đối tượng có cùng biểu tượng.

+0

Vì vậy, rất có thể, nó sẽ là một hoặc phiên bản libjpeg khác mà sẽ "giành chiến thắng" phải không? Vì vậy, hoặc nó sẽ chọn phiên bản openCV, trong trường hợp mọi thứ sẽ hoạt động, hoặc việc chuyển đổi tiêu đề openCV sử dụng trong quá trình biên dịch sang tệp tự do sẽ khắc phục ... nhưng nó không = ( –

+0

Nếu liên kết được chọn là khác với tiêu đề bạn sử dụng, sau đó tôi mong đợi nó sẽ _not_ làm việc.Bạn sẽ cần phải chuyển đổi tiêu đề _and also_ sắp xếp lại các libs trên đường liên kết, và thậm chí đó là thất bại tán tỉnh tốt hơn để rời khỏi lib bạn không muốn sử dụng hoàn toàn dòng liên kết –

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