2012-03-06 49 views
5

Tôi đang sử dụng thư viện Boost trên OS X bằng Xcode. Boost đã được cài đặt trên hệ thống của tôi bằng cách sử dụng macports. Tôi đã xây dựng thành công ứng dụng của mình bằng cách thêm 3 thư viện tăng cường mà tôi cần (ví dụ: libboost_thread-mt.a) vào danh sách 'Liên kết nhị phân với thư viện' của mục tiêu. Tuy nhiên tôi cần phải liên kết các thư viện này tĩnh để ứng dụng sẽ chạy trên các máy tính khác mà không cần thư viện tăng cường cần được cài đặt.Tăng liên kết tĩnh của thư viện trên Xcode 4

Làm cách nào để thực hiện điều này một cách chính xác? Thông qua nhiều tìm kiếm google của tôi, tôi đang tìm kiếm, tôi có thể cần phải thêm '-static' - nơi tôi thêm điều này vào Xcode?

Trả lời

7

Nếu bạn đã liên kết với thư viện .a, thì bạn đã liên kết tĩnh. Bạn không bao giờ cần gửi các thư viện .a. Chúng chỉ là các đối tượng.


EDIT: lỗi của bạn mạnh mẽ cho thấy rằng bạn đang liên kết các dylib chứ không phải là .a. Nếu bạn có libfoo.dyliblibfoo.a trong đường dẫn thư viện của mình, ngay cả khi bạn nói "liên kết libfoo.a" trong Xcode và thậm chí nếu libfoo.a trước đó trong đường dẫn tìm kiếm, nó vẫn sẽ liên kết libfoo.dylib. Điều này là do liên kết của Xcode hoàn toàn bị hỏng và chuyển -lfoo đến trình liên kết (bạn không bao giờ nên sử dụng -l cho thứ gì đó bạn đã tạo và có đường dẫn chính xác đến). Tôi luôn khuyên bạn nên liên kết các thư viện bạn đã tạo trong LDFLAGS trong tệp xcconfig thay vì sử dụng ngăn xây dựng. Bạn vượt qua đường dẫn chính xác mà bạn muốn thay vì sử dụng -l. Xem Abandoning the Build Panel để biết thêm suy nghĩ của tôi về xcconfig. Nó đã lỗi thời, vì nó được viết cho Xcode3, nhưng những điều cơ bản vẫn được áp dụng.

Sử dụng ngăn xây dựng, bạn cũng có thể chuyển toàn bộ đường dẫn đến thư viện trong "Cờ liên kết khác". Nhưng điều này vẫn có tất cả các vấn đề của cửa sổ xây dựng.

Giải pháp nhanh hơn (nhưng kém mạnh hơn) đôi khi thêm -Wl,-search_paths_first vào "Cờ liên kết khác". Điều này thay đổi hành vi sao cho mỗi đường dẫn thư viện được tìm kiếm cho cả .dylib.a trước khi tiếp tục (hành vi mặc định là tìm kiếm ở mọi nơi cho .dylib và chỉ sau đó tìm kiếm .a). Vì vậy, nếu .a của bạn nằm trong một thư mục khác từ .dylib và thư mục đó trước đó trong đường dẫn tìm kiếm, thư mục này sẽ hoạt động.

Câu hỏi này cuối cùng đã giúp tôi mở một số radar về vấn đề này, điều mà tôi nên làm từ nhiều năm trước. Tôi khuyên những người khác mở duplicates.

+0

Đó là những gì tôi nghĩ mặc dù khi cố chạy ứng dụng trên một máy tính khác, ứng dụng sẽ không chạy và có lỗi nói rằng nó không thể định vị tệp .dylib có liên quan. Các tệp .a có nên được liên kết với dự án ở một nơi khác ngoài phần 'Liên kết nhị phân với thư viện' không? –

+0

"Sử dụng ngăn xây dựng, bạn cũng có thể chuyển toàn bộ đường dẫn đến thư viện trong" Các Cờ Liên kết Khác "- điều này đã giải quyết được vấn đề. –

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