Có cách nào (trong Linux) để xác định thư viện nào tôi phải liên kết với chương trình C/C++ không? Tôi không muốn bỏ lỡ một thư viện, ngay cả trong các tình huống khi các ký hiệu không xác định sẽ không được phát hiện khi bắt đầu chương trình. Ngoài ra, tôi muốn tránh những phụ thuộc không cần thiết của khóa học.Làm cách nào để biết thư viện nào liên kết?
Tôi đã xây dựng câu hỏi này nói chung, nhưng đây là một ví dụ cụ thể, không đặc biệt: Cho đến gần đây, tôi nghĩ rằng tôi cần liên kết với libpython cho các mô-đun Python được phát triển với Boost.Python. Tuy nhiên, điều này không đúng: Viết một mô-đun với Boost.Python; nó thậm chí có thể sử dụng các hàm từ API C C, không chỉ Boost.Python. Liên kết với libboost_python là đủ! Điều này là không rõ ràng ở tất cả-tôi đã không tìm thấy nó tài liệu, ít nhất, và có Boost.Python mô-đun xung quanh mà không cần thiết liên kết với libpython. Ngoài ra, điều này khó phát hiện vì libboost_python.so không liệt kê libpython là phụ thuộc theo báo cáo của ldd
. (Tôi tin rằng thư viện Python được nạp động trong trường hợp này.)
[Đã thêm sau: Điều này độc lập với Boost.Python. Ngoài ra, nếu sử dụng API C C cấp thấp, mô-đun Python có thể được biên dịch và không được liên kết với libpython và nó sẽ hoạt động. Tuy nhiên, hãy xem các nhận xét và câu trả lời bên dưới nói rằng bạn nên liên kết với libpython.]
Vì vậy, làm cách nào để tìm ra liên kết không cần thiết một cách có hệ thống thay vì dùng thử và lỗi? Thủ tục chung tốt, không chỉ cho ví dụ này là gì?
[Đã thêm sau: Đây là những gì tôi đã học được từ các nhận xét cho câu hỏi của mình. Các sự kiện dưới đây không rõ ràng với tôi khi tôi đăng câu hỏi này, vì vậy tôi đánh vần chúng ngay bây giờ, vì lợi ích của những người ghé thăm cuộc thảo luận này trong tương lai, và ngay cả khi những điều này là hiển nhiên đối với những người bình luận hữu ích. (Cảm ơn!)
Biểu tượng giải quyết hoạt động theo cách chuyển tiếp trong Linux (như được chỉ ra bởi người dùng MvG và millimoose). Giả sử chương trình A cần phải giải quyết các biểu tượng từ libB và libC. Giả sử thêm rằng A được liên kết với libB và libB được liên kết với libC. Sau đó, A có thể được tải và thực thi ngay cả khi nó không trực tiếp tham chiếu đến libC.
Tuy nhiên, thực tiễn không tốt là dựa vào sự chuyển đổi này, như các nhà bình luận đã chỉ ra. Trong trường hợp các mô-đun Python được viết bằng C/C++, điều này có nghĩa là một mô-đun nên liên kết với libpython. Đối với trường hợp chung, mục tiêu phải là không phải là là để xác định danh sách thư viện tối thiểu cần thiết để liên kết và thực hiện — như câu hỏi orignal của tôi bằng cách nào đó được nêu ra. đã giải quyết trực tiếp trực tiếp.
Tóm tắt câu trả lời của Salgar, thông tin này thường chỉ có thể thu được từ tài liệu của thư viện được sử dụng.Ngoài ra, cờ liên kết GCC -Wl,--as-needed
rất hữu ích để xác định các thư viện thực sự không cần thiết.]
Nếu không cần thiết, chi phí liên kết sẽ mất một thời gian để tìm ra điều đó, nhưng sau đó nó sẽ xóa nó khỏi danh sách phụ thuộc, giống như bạn đã không vượt qua nó. –
@Ben: I don ' Tôi nghĩ vậy. Trong ví dụ của tôi, nếu tôi chuyển '-lpythonX.Y' làm cờ trình biên dịch, thì * libpythonX.Y.so * xuất hiện trong đầu ra' ldd', ngay cả khi module hoạt động tốt mà không có sự phụ thuộc * libpython *. – Daniel
Ngoài ra, hãy thử một thư viện ngẫu nhiên (bất cứ thứ gì từ thư mục '/ usr/lib' của bạn). Nếu bạn liên kết với nó, nó sẽ hiển thị trong đầu ra 'ldd', ngay cả khi nó không được sử dụng. – Daniel