2009-01-19 40 views
11

Mục tiêu Xcode của tôi liên kết với thư viện hdf5 (sử dụng giai đoạn Xây dựng Nhị phân với Thư viện). libhdf5 được cài đặt bằng MacPorts, do đó/opt/local/lib chứa cả phiên bản động (.dylib) và tĩnh (.a) của thư viện.Buộc liên kết tĩnh của thư viện được liên kết với mục tiêu Xcode?

Kết quả văn bản từ bản dựng cho thấy có, như mong đợi, một -lhdf5 trong bước liên kết của bản dựng. gcc dường như lấy thư viện liên kết động qua tĩnh, tuy nhiên. Có cách nào để buộc gcc (thông qua một chuyển đổi trình biên dịch hoặc thông qua Xcode) để liên kết tĩnh với libhdf5.a?

Giải pháp duy nhất tôi tìm thấy là sao chép libhdf5.a vào thư mục dự án (hoặc khác) và chống lại bản sao đó, do đó tránh các phiên bản động và tĩnh ở cùng một vị trí.

+0

Tôi rất thích nhìn thấy một số câu trả lời được cập nhật cho câu hỏi này với hướng dẫn cho các phiên bản Xcode mới hơn. – livingtech

Trả lời

7

Trong phản ứng để xét của bạn về Eduard Wirch' câu trả lời: bạn cũng có thể kiểm soát liên kết tĩnh cho chỉ có một thư viện này, nếu bạn thay thế -lhdf5 bởi - l/full/path/to/libhdf5.a

+8

Có vẻ như "-l" thực sự cần được bỏ qua, theo câu trả lời khác được đưa ra. Nếu tôi bao gồm nó, trình liên kết cho tôi "ld: thư viện không được tìm thấy cho -l/opt/local/lib/libhdf5.a", trong khi chỉ cần chuyển nó tới đường dẫn "/ opt/local/lib/libhdf5.một "không có cờ hoạt động tốt. – spieden

+0

Làm thế nào để sửa lỗi này khi sử dụng automake? – meijuh

1

Sử dụng công tắc "-static" để liên kết: GCC link options

+0

Điều này sẽ buộc liên kết tĩnh của tất cả các thư viện, hoặc ứng dụng của nó có thể được kiểm soát trên cơ sở cho mỗi thư viện không? –

+0

Thực ra nó sẽ liên kết tất cả các thư viện tĩnh. –

13

Có vấn đề chính xác như vậy và mặc dù đây là một bài đăng cũ, tôi nghĩ tôi sẽ chia sẻ những gì tôi phải làm để thực hiện công việc này.

Thông thường bạn chỉ cần cung cấp công tắc '-static' cho trình liên kết, với Xcode, điều này làm cho tất cả các libs bao gồm cả crt được liên kết tĩnh. Tôi gặp lỗi:

can't locate file for: -lcrt0.o 

Khi tôi thử điều này.

Điều mà làm việc đối với tôi là để thay thế:

-lmylib 

với

/path/to/libmylib.a

Lưu ý: -l được giảm.

3

trường hợp của tôi với Xcode 4.5:

Khi tôi kéo và thả một thư viện C tĩnh (một thư viện của bên thứ 3 được biên soạn với GNU Autotools) để khuôn khổ của dự án (Project Navigator > Frameworks) mối liên kết dường như nghĩ rằng đó là một thư viện năng động và thêm -L -l cờ:

-L/path/to/libfoodir -lfoo 

Liên kết không thành công vì không có /path/to/libfoodir/libfoo.dylib. Lệnh mối liên kết có thể được nhìn thấy từ:

Log Navigator > select a Build log > select a Link line and expand it 

Các liên kết thành công khi tôi thêm một đường dẫn đầy đủ (/path/to/libfoodir/libfoo.a) để các thiết lập mối liên kết:

Targets > Build Settings (all) > Other linker flags 
Các vấn đề liên quan