2008-10-16 18 views
36

Tôi có một thư viện được chia sẻ mà tôi muốn liên kết một tệp thực thi với việc sử dụng GCC. Thư viện được chia sẻ có tên không chuẩn, không phải dạng libNAME.so, vì vậy tôi không thể sử dụng tùy chọn -l thông thường. (Nó cũng xảy ra cũng là một phần mở rộng Python, và do đó không có tiền tố 'lib'.)Làm cách nào để liên kết bằng cách sử dụng GCC mà không có đường dẫn mã hóa cứng cho một thư viện không tuân theo quy ước đặt tên libNAME.so?

Tôi có thể chuyển đường dẫn đến tệp thư viện trực tiếp đến dòng lệnh liên kết, nhưng điều này làm cho đường dẫn thư viện trở thành hardcoded vào thực thi.

Ví dụ:

g++ -o build/bin/myapp build/bin/_mylib.so 

Có cách nào để liên kết đến thư viện này mà không gây ra con đường để được hardcoded vào thực thi?

Trả lời

57

Có một ":" tiền tố cho phép bạn để cung cấp cho tên gọi khác nhau để các thư viện của bạn. Nếu bạn sử dụng

g++ -o build/bin/myapp -l:_mylib.so other_source_files 

nên tìm đường dẫn của bạn cho _mylib.so.

+1

Điều này, thưa bạn, chính xác là những gì tôi đang tìm kiếm. Cảm ơn! – kbluck

+0

Giúp tôi rất nhiều, cảm ơn bạn. –

+2

Tôi thấy rằng kết quả này trong 'build/bin/_mylib.so' được nhúng trong thư viện được liên kết bằng cách sử dụng' -l: '- thay vì nhúng chỉ' _mylib.so' như bình thường đối với các tên son chuẩn. Kết quả là, khi bạn thử tải '_mylib.so', nó sẽ tìm kiếm đường dẫn đầy đủ đó (' ldd' sẽ hiển thị nó) và sẽ không tự tìm thấy '_mylib.so'. –

2

Nếu bạn có thể sao chép các thư viện chia sẻ vào thư mục làm việc khi g ++ được gọi thì đây nên làm việc:

g++ -o build/bin/myapp _mylib.so other_source_files 
1

Nếu bạn đang ở trên Unix hoặc Linux Tôi nghĩ rằng bạn có thể tạo một liên kết tượng trưng đến thư viện trong thư mục bạn muốn thư viện.

Ví dụ:
ln -s build/bin/_mylib.so build/bin/lib_mylib.so

Sau đó, bạn có thể sử dụng -l_mylib

http://en.wikipedia.org/wiki/Symbolic_link

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