2009-09-17 3 views
8

Tôi có một ứng dụng dòng lệnh unix (với tệp makefile lớn khó chịu) mà tôi đang cố gắng chạy trên một mac. Tôi đang biên dịch nó trên một hệ thống 10.6, với tất cả các thư viện thích hợp của khóa học. Môi trường triển khai là hệ thống 10.5, không có thư viện bổ sung.Các thư viện tĩnh trong chương trình được biên dịch chéo

Tôi đã biên soạn mà không có tính động và có vẻ như có thư viện tĩnh, chính xác. Khi tôi chạy nó trên hệ thống 10.6, nó hoạt động. Tuy nhiên, khi tôi chạy nó trên hệ thống 10.5, tôi nhận được:

dyld: unknown lệnh tải yêu cầu 0x80000022

Tôi đã nhận lỗi này tương tự khi tôi biên soạn mọi thứ cho 10,6 hệ thống bằng cách sử dụng 10,5 xcode, vì vậy nó trông giống như vấn đề loại so khớp sai. Tuy nhiên, tôi đã sử dụng gcc-4.0, và

$ CFLAGS = -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx phiên bản-min = 10,5

nên nó NÊN được thiết lập cho 10,5 .. bất kỳ ý tưởng nào?

nhờ

Chỉnh sửa một câu hỏi cổ:

Tôi có vấn đề chính xác cùng trên một máy tính khác nhau. Lần này tôi đang ở 10.5.8, cập nhật đầy đủ, cùng một công việc thực thi trên 10.6 vẫn còn.

Có ai có may mắn với điều này trong những tháng kể từ khi tôi hỏi điều này không?

+0

Khi tôi google vấn đề tôi nhận được câu hỏi của bạn. Chúc may mắn! – Alan

+0

Heh, vâng, tôi đã có trải nghiệm tương tự trên trang web dev của apple ... Tôi đã tìm thấy một câu hỏi cũ của riêng tôi ... –

+0

Tôi có cùng một vấn đề. –

Trả lời

0

Tùy thuộc vào số lượng thư viện bạn sử dụng, có thể khó nhận được tất cả các thư viện được liên kết tĩnh.

Để có được một gói độc lập cho một ứng dụng của riêng tôi, tôi đã thực hiện một MacPorts tùy chỉnh cài đặt trong một thư mục không chuẩn, để tôi có thể dynlink với các thư viện từ thư mục đó và chỉ bị ràng buộc trong việc yêu cầu mọi người cài đặt toàn bộ thứ đó vào cùng một nơi trên máy tính của họ. nó anyway.

Chúc may mắn

Pascal

+0

Vâng, ít nhất là các thư viện không chuẩn (ngoại trừ/usr/lib/X11/libexpat *, bất kỳ cái gì, bị depricated ở 10.5, nhưng tôi vẫn cần vì bất kỳ lý do gì) được biên dịch ... và đó là 't "không biết tải lệnh" anyway anyway ... –

+0

Tôi đã không nghĩ rằng nó thông qua, nhưng bây giờ mà bạn đề cập đến nó, tự động * nạp * thư viện, mà thậm chí sẽ không hiển thị với otool -L, có thể là lý do tôi có vấn đề riêng của mình liên kết mọi thứ tĩnh. –

0

nó chỉ ra rằng có một l động chức năng tải trọng (0x22) đã được thêm vào ở 10.5.6. Hệ thống tôi đang chạy là 10.5.5. Tôi đã nâng cấp lên 10.5.8 và mọi thứ đều chạy!

+0

Không, trên một máy tính khác, 10.5.8 và nó KHÔNG chạy ... dagnabit. –

0

Ok, giải pháp SECOND, và KHÔNG thỏa mãn, là tìm máy tính 10.5.8, cài đặt gói nhà phát triển và biên dịch lại ... tương tự cho powerPC ... buồn nhưng nó sẽ hoạt động ...

2

Tôi đã tìm kiếm cùng một vấn đề, như tôi phát triển trên 10.6 nhưng phải có phiên bản hoạt động trên 10.5. Ngoài các cờ biên dịch trên, bạn nên thêm:

-no_compact_linkedit

Nó được mô tả ở đây:

http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ld.1.html

nơi nó nói:

Thông thường khi nhắm mục tiêu Mac OS X 10.6, trình liên kết sẽ tạo thông tin nhỏ gọn trong phân đoạn __LINKEDIT.Tùy chọn này làm cho trình liên kết thay vào đó tạo ra thông tin di chuyển truyền thống.

Tôi đã đến đó từ cuộc thảo luận về danh sách gửi thư của người dùng xcode về "lệnh tải yêu cầu không xác định 0x80000022".

+1

Tôi xây dựng trên OS X 10.7 một tệp thực thi đơn giản, treo trên OS X 10.5.10, nhưng tùy chọn trình biên dịch được đề xuất của bạn * -no_compact_linkedit * tạo ra kết quả chính xác byte-khôn ngoan như không có tùy chọn này. :( – Mot

3

Lý do cho sự dyld 0×80000022 lỗi thể được điều đó, bạn đang liên kết trên OS X 10.6, và OS X 10.6 sẽ sử dụng một lệnh tải (LC_DYLD_INFO_ONLY = 0×80000022) mà OS X 10.5 không không hiểu.

Để sửa lỗi này, chắc chắn rằng bạn đang sử dụng một mục tiêu triển khai bằng cách thiết lập các biến môi trường ngay trước khi lệnh liên kết của bạn:

export MACOSX_DEPLOYMENT_TARGET=10.5 

(hoặc setenv MACOSX_DEPLOYMENT_TARGET=10.5)

Bạn luôn có thể kiểm tra nếu sử dụng thực thi của bạn lệnh tải đúng như sau:

otool -l executable 

Nó sẽ hiển thị LC_DYLD_INFO_ONLY (không có mục tiêu triển khai) nds hoặc LC_DYLD_INFO (với mục tiêu triển khai).