2012-09-25 25 views
7

Tôi đang cố gắng xây dựng và liên kết một dự án dựa trên C++, cmake với clang (3.0). Dự án này liên kết đến một số thư viện được cài đặt trong thư mục tùy chỉnh/my/dir /. Thư mục này được bao gồm trong các biến môi trường LD_LIBRARY_PATH và LIBRARY_PATH. Dự án xây dựng và liên kết tốt với g ++.Trình liên kết Clang không nhìn vào LD_LIBRARY_PATH

Lệnh liên kết tạo ra và thực hiện bởi cmake trông giống như sau:

/usr/bin/clang++ -O3 stuff.cpp.o -o stuff -rdynamic -lmylib 

ld sau đó phàn nàn với thông báo sau:

/usr/bin/ld: cannot find -lmylib 

Lệnh liên kết ở trên chạy tốt bất cứ khi nào tôi tự thêm -L/my/dir/ . Có cách nào để liên kết mà không chỉ định cờ -L không?

+3

['LD_LIBRARY_PATH'] (http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html) là để tải thư viện lúc khởi động, không phải để giải quyết các phụ thuộc liên kết. Có lẽ bạn muốn sử dụng 'LDFLAGS'? –

+0

Thú vị. Tôi sử dụng __g ++ __ và __clang ++ __ thay thế lẫn nhau với CMake nhưng không bao giờ gặp vấn đề tương tự. Tôi chỉ sử dụng macro 'link_directories()' để định nghĩa đường dẫn thư viện. – Hindol

Trả lời

7

Biến môi trường $LD_LIBRARY_PATH (và lựa chọn thay thế khác nhau của nó trên nền tảng UNIX-based khác) được sử dụng ở runtime, không liên kết thời gian, để tìm các thư viện.

Sử dụng -L là phương pháp chính xác và không thể tránh được.

Lưu ý: Một cách tiếp cận tốt hơn trong Linux (bạn không chỉ định nền tảng của mình để tôi đoán) là định cấu hình chính xác tệp trong /etc/ld.so.conf.d/ và tránh sử dụng hoàn toàn $LD_LIBRARY_PATH.

+1

Lưu ý rằng tôi cũng đã định nghĩa biến LIBRARY_PATH. Như được giải thích trong câu hỏi này http://stackoverflow.com/questions/4250624/ld-library-path-vs-library-path biến này là điều cho phép gcc tìm các thư viện tùy chỉnh. Tôi đang tìm kiếm một cái gì đó tương tự cho clang. –

+0

@ RégisB. Hấp dẫn; Tôi chưa bao giờ sử dụng 'LIBRARY_PATH'. Vấn đề với việc sử dụng '-L' là gì? – trojanfoe

+1

Tùy chọn -L yêu cầu thay đổi cấu hình cmake, được chia sẻ với đồng nghiệp của tôi. Bây giờ tôi sẽ thử cách /etc/ld.so.conf.d/. –

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