2011-11-17 34 views
36

Tôi đã thử phương pháp này trong question, nhưng có vẻ như phiên bản linux của ar không giống với phiên bản mac vì tôi không thể kết hợp lại các tệp đối tượng.Kết hợp các thư viện tĩnh

Điều cơ bản tôi muốn làm là hợp nhất một thư viện tĩnh khác vào sản phẩm xây dựng thư viện tĩnh Xcode của tôi thông qua giai đoạn xây dựng kịch bản lệnh chạy.

Thật không may tôi không thể biên dịch trực tiếp thư viện khác vào dự án của mình vì nó có hệ thống xây dựng riêng (do đó tôi sử dụng các thư viện biên dịch).

Tôi nghĩ rằng có thể hợp nhất thư viện khác qua ar vào thư viện được tạo Xcode mà không giải mã sản phẩm xây dựng. Làm cách nào để tôi thực hiện việc này?

Trả lời

62

bạn có thể sử dụng libtool để làm điều đó

libtool -static -o new.a old1.a old2.a 
+2

Đây thực sự là giải pháp tốt hơn 'ar'. Cảm ơn! –

+0

Tôi có thể chạy cái này ở đâu? –

+0

bất kỳ dòng lệnh nào (bash), bạn nên có libtool trong PATH miễn là bạn có phần mở rộng của trình phát triển. Ngoài ra, như là một bước xây dựng bài trong xcode. – Bruce

0

Bạn chỉ có thể liên kết một với nhau. Vì vậy ... chỉ cần sử dụng ld để hợp nhất các hình ảnh.

0

Bạn nên sử dụng ar -r để tạo ra một kho lưu trữ trên hệ điều hành MacOS:

ar -x libabc.a 
ar -x libxyz.a 
ar -r libaz.a *.o 
+0

Điều này hoàn toàn không hiệu quả. Bạn sẽ ghi đè lên các tệp có cùng tên .o. –

3

Nếu bạn đang làm việc với các thư viện tĩnh đa kiến ​​trúc, một chút của thao tác thêm là cần thiết để mỏng mỗi thư viện, kết hợp các phiên bản mỏng, và sau đó vỗ béo kết quả. Đây là một kịch bản tiện dụng mà bạn có thể chỉnh sửa cho sự hài lòng của bạn mà làm tất cả những gì trong một. Ví dụ này có ba thư viện iOS path/to/source/libs/libone.a, path/to/source/libs/libtwo.apath/to/source/libs/libthree.a và hợp nhất chúng vào một thư viện duy nhất libcombined.a.

#! /bin/bash 

INPATH="path/to/source/libs" 

LIBPREFIX="lib" 
LIBS="one two three" 
LIBEXT=".a" 

OUT="combined" 

ARCHS="armv7 armv7s arm64" 

for arch in $ARCHS 
do 
    for lib in $LIBS 
    do 
    lipo -extract $arch $INPATH/$LIBPREFIX$lib$LIBEXT -o $LIBPREFIX$lib-$arch$LIBEXT 
    done 
    INLIBS=`eval echo $LIBPREFIX\{${LIBS// /,}\}-$arch$LIBEXT` 
    libtool -static -o $LIBPREFIX$OUT-$arch$LIBEXT $INLIBS 
    rm $INLIBS 
done 

OUTLIBS=`eval echo $LIBPREFIX$OUT-\{${ARCHS// /,}\}$LIBEXT` 
lipo -create $OUTLIBS -o $LIBPREFIX$OUT$LIBEXT 
rm $OUTLIBS 
Các vấn đề liên quan