2012-06-16 43 views
5

Tôi đã tạo một loạt các tệp .o (qua gcc -c $file.c $someotherops -o $file.o). Bây giờ tôi muốn liên kết chúng vào một thư viện tĩnh.cách liên kết thư viện tĩnh cho iOS

Tôi không chắc chắn chính xác thời tiết tôi phải sử dụng ld hoặc gcc cho việc này. Trong hướng dẫn sử dụng ld, người ta nói rằng tôi không được phép sử dụng nó trực tiếp. Tuy nhiên, tôi không thể tìm ra các tham số gcc để tạo một thư viện tĩnh.

Tôi đã thử ld *.o -static -o libfoo.a nhưng nó phàn nàn về rất nhiều biểu tượng bị thiếu (tôi nghĩ tất cả từ libc). Tôi không hiểu tại sao nó phàn nàn vì nó được coi là một thư viện tĩnh. Tôi nghĩ nó sẽ kiểm tra các ký hiệu khi tôi liên kết thư viện tĩnh đó với một số thứ khác.

Một điều khác: tôi sử dụng /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld tại đây (mục tiêu của tôi là iOS). Nó than phiền với cảnh báo ld: warning: using ld_classic. Về việc này là gì?

Sau đó, tôi nghĩ, có thể nó cần phải có thư viện động được chỉ định. Vì vậy, tôi đã thêm -lc để liên kết chống lại libc. Nhưng nó phàn nàn với can't locate file for: -lc. Tôi đã thêm -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib và có libc.dylib.

Bất kỳ ý tưởng nào?


Giới thiệu về lỗi -lc: Đã hết sau khi tôi chỉ định -arch armv6. Sau đó, nó phàn nàn về một sai libcache.dylib (mà phải được liên kết từ libc.dylib Tôi đoán bởi vì nó đã không chỉ định nó). Đã thêm -L.../usr/lib/system.

Hiện tại, đối với mỗi tệp .o, tôi nhận được cảnh báo ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated. Về việc này là gì?

Và tôi vẫn còn có một loạt các ký tự còn thiếu, đặc biệt:

Undefined symbols for architecture armv6: 
    "start", referenced from: 
    -u command line option 
    (maybe you meant: _PyThread_start_new_thread) 
    "___udivsi3", referenced from: 
     _get_len_of_range in bltinmodule.o 
     _quorem in dtoa.o 
     _array_resize in arraymodule.o 
     _newarrayobject in arraymodule.o 
     _array_fromfile in arraymodule.o 
     _get_len_of_range in rangeobject.o 
     _inplace_divrem1 in longobject.o 
     ... 
    "___unorddf2", referenced from: 
     _builtin_round in bltinmodule.o 
    ... 

Tôi đã kiểm tra một số những biểu tượng, ví dụ ___udivsi3 trong get_len_of_range. Hàm này chỉ sử dụng số học C, không có cuộc gọi bên ngoài. Vì vậy, điều này dường như được dịch để sử dụng một số chức năng bên ngoài như ___udivsi3. Nhưng thư viện này là gì?


-lgcc_s.1 cố định hầu hết các ___udivsi3 và các ký hiệu còn thiếu liên quan. Biểu tượng start vẫn bị thiếu. -u command line option có nghĩa là gì?


Từ here, tôi có cảm giác rằng có lẽ ld không phải là công cụ thích hợp sau khi tất cả. Ở đó, một cuộc gọi đơn giản tới ar được sử dụng. Và điều này dường như có ý nghĩa hơn. Tôi sẽ kiểm tra xem điều đó có tác dụng hay không và biến nó thành câu trả lời sau đó.


Trong khi chơi hơn xung quanh, ar ném một số cảnh báo với tôi khi xây dựng một thư viện tĩnh chất béo. Nó đã cho tôi gợi ý sử dụng libtool thay thế. Đó là những gì tôi đang làm bây giờ, tức là libtool -static -o libfoo.a *.o. Ngoài ra tôi chuyển trình biên dịch sang /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang nhưng không chắc chắn nếu vấn đề đó.

Bây giờ, ở biên soạn một số ứng dụng thử nghiệm trong đó liên kết đến các thư viện tĩnh này, tôi nhận được những cảnh báo này:

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4 

họ là gì vậy? Tôi không sử dụng -mdynamic-no-pic. Tôi cũng không thực sự nhìn thấy trong _PyBuiltin_Init cách tôi sử dụng địa chỉ tuyệt đối ở đó.

Ngoài ra, các địa chỉ tuyệt đối này nằm ngoài phạm vi nào? Chỉnh sửa: Đây là một số phân bổ thực sự rất lớn. Tôi vừa xóa mã này ngay bây giờ (đây là WITH_PYMALLOC, nếu có ai quan tâm đến những nội dung Python cụ thể này).

Khi tôi bắt đầu nó trên iPhone của tôi, tôi nhận được hủy bỏ:

dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...

Khi tôi sử dụng -no_pie để liên kết, nó thậm chí không liên kết. Nó không thành công với:

Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7


tôi đã giải quyết được lỗi PIE tàn tật, Absolute giải quyết. Tôi có một số -static trong dòng lệnh Clang. Một khi tôi gỡ bỏ điều đó, cảnh báo đã biến mất, cũng như lỗi dyld/vm_protect. Đây là lần đầu tiên nó thực sự chạy một số mã.

Cho đến khi tôi nhấn another strange error about integer comparison. Theo đó, điều này trông giống như một lỗi trong bản dựng Clang của họ.

+0

một câu hỏi; tại sao bạn không tạo một dự án thư viện tĩnh XCoe và xây dựng thư viện tĩnh với dự án đó? – CarlJ

+0

@meccan: Tôi muốn có kịch bản biên dịch của riêng mình trong trường hợp này vì lý do đa số (chủ yếu là vì dự án cụ thể này, điều này đơn giản hơn nhiều bây giờ). Dù sao, ngay cả khi tôi sẽ làm điều đó với Xcode, câu hỏi này vẫn hợp lệ/mở như tôi muốn hiểu làm thế nào để làm điều đó bằng tay. – Albert

+0

okay, và bạn biết bạn có thể xây dựng một dự án Xcode từ trình bao? – CarlJ

Trả lời

12

Tất cả đều hoạt động ngay bây giờ. Về cơ bản, câu trả lời là:

  • Chỉ cần biên dịch tất cả các tập tin *.c như thường lệ để *.o tập tin. Sự khác biệt thực sự duy nhất là GCC/Clang khác nhau, -arch armv7, các SDK/thư mục bao gồm khác nhau.

  • Sử dụng libtool -static -o libfoo.a *.o để tạo thư viện tĩnh.

Vậy đó. Các vấn đề khác trong câu hỏi của tôi chỉ là những cố gắng sai lầm.

1

Nếu có ai đến đây bằng cách tìm kiếm lỗi thời gian chạy dyld: vm_protect(...) nhưng bạn đang sử dụng XCode, cờ -static được đề cập trong OP có thể là vấn đề.

Loại bỏ nó bằng cách chuyển "Bật liên kết với thư viện được chia sẻ" thành "Có" (mặc định) trong cài đặt ngôn ngữ trình biên dịch LLVM. (Điều này loại bỏ GCC_LINK_WITH_DYNAMIC_LIBRARIES = NO từ tệp dự án).

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