2016-02-10 24 views
6

tôi muốn bao gồm libgpgerror và libgcrypt trong nhanh chóng-dự án của tôi và tạo ra module.modulemaps sau:Xcode "ld: không tìm thấy thư viện [...] cho kiến ​​trúc x86_64"

libgpgerror:

libgcrypt:

module libgcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/libgcrypt-1.6.5.dylib'" 
    export * 
} 

tôi cũng đã thêm các "Swift Compiler - Search Path/Import Path": /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/** cho cả hai dự án và mục tiêu. Các mô-đun được tìm thấy, các đường dẫn là chính xác.

Tuy nhiên nếu tôi muốn biên dịch dự án tôi nhận được lỗi sau:

ld: library not found for -l'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib' for architecture x86_64 

Nhưng nếu tôi làm

file /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib 

tôi nhận được đầu ra

/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib: Mach-O 64-bit dynamically linked shared library x86_64 

Vì vậy, có vẻ như thư viện ở đúng vị trí và cũng có kiến ​​trúc chính xác.


Sửa

Tôi tìm thấy một workaround: tôi loại bỏ các liên kết chỉ thị từ modulemaps và liên kết các thư viện bằng tay; điều này dường như hoạt động. Nhưng tại sao?

module libgpgerror { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h" 
    export * 
} 
+0

Bạn có đang sử dụng Trình quản lý gói Swift không? Làm thế nào bạn có thể liên kết các thư viện theo cách thủ công? –

+1

Tôi đã có thể làm cho nó xây dựng bằng cách xác định rõ ràng đường dẫn dylib trong lệnh xây dựng nhanh chóng. 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include /' –

+0

Nếu bạn không thêm chỉ thị liên kết, bạn có thể chỉ định cờ '-luv' và tạo xcodeproj sẽ có các cờ cần thiết được thiết lập: 'swift build -Xlinker -L/usr/local/lib/-Xcc -I/usr/local/include/-Xlinker -luv --generate-xcodeproj' –

Trả lời

5

Chỉ thị liên kết chỉ chỉ định tên của thư viện được liên kết. Đó là nó nên xác định hậu tố của cờ linker cho thư viện. Dường như chỉ thị có "-l" và nối tên để tạo cờ liên kết.

Điều này có nghĩa là cách chính xác để chỉ định bản đồ mô-đun của bạn như sau.

module CGcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    link "gcrypt" 
    export * 
} 

Điều này sẽ tạo cờ liên kết -lgcrypt là cờ liên kết chính xác.

Tuy nhiên, có một vấn đề khác là người liên kết cần có khả năng tìm tệp dylib cho gcrypt và theo mặc định nó chỉ trông trên một số đường dẫn nhất định. Bạn có thể tìm thấy các đường dẫn này bằng cách chạy clang -Xlinker -v. Đầu ra cho tôi trông như thế này:

tylercloutier$ clang -Xlinker -v 
@(#)PROGRAM:ld PROJECT:ld64-264.3.101 
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) 
Library search paths: 
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib 
... more stuff ... 

Bây giờ tôi không chắc chắn, nhưng tôi nghi ngờ rằng những con đường tìm kiếm thông thường có lẽ

/usr/lib 
/usr/local/lib 

nhưng tôi nghĩ rằng Xcode đã thay đổi con đường tìm kiếm của tôi để điểm số MacOSX10.11.sdk/usr/lib, trong đó, tình cờ, về cơ bản có cùng một tập hợp các tệp như /usr/lib (chúng không được liên kết với nhau). Thật vậy, ở El Capitan, vì Bảo vệ toàn vẹn hệ thống thậm chí sudo sẽ không cho phép bạn chỉnh sửa /usr/lib.

Vì vậy, vấn đề mà tôi đang gặp là mặc dù tôi đã cài đặt thư viện của mình thành /usr/local/lib, nhưng không thể liên kết chúng.Để khắc phục điều đó, tôi có thể chỉ định đường dẫn tìm kiếm một cách rõ ràng.

swift build -Xlinker -L/usr/local/lib/ 

Và chúng tôi đang đi đến các cuộc đua. Tôi thậm chí có thể tạo ra một xcodeproj mà sẽ có cờ linker thích hợp đã được thiết lập trong Other Linker Flags.

swift build -Xlinker -L/usr/local/lib/ --generate-xcodeproj 

Nếu bạn bỏ qua các chỉ thị liên kết trong tập tin bản đồ mô-đun, bạn có thể xác định nó như một lá cờ:

module CGcrypt { 
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" 
    export * 
} 

Giống như rất

swift build -Xlinker -L/usr/local/lib/ -lgcrypt 

Làm thế nào để thay đổi thư viện mặc định đường dẫn tìm kiếm, tôi không biết. Nhưng nó sẽ là tuyệt vời nếu ai đó có thể làm sáng tỏ vấn đề này!

+0

Ít nhất là trong Xcode, bạn chỉ cần thêm một đường dẫn tìm kiếm thư viện khác. Giải pháp này hoạt động; ty –

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