Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use static library and module map file with Swift?

I'm trying to include a 3rd party static library in my Swift project. I have these two files, among a few others.

GoogleConversionTrackingSDK/ACTReporter.h GoogleConversionTrackingSDK/libGoogleConversionTracking.a

I added the .a file to the target's "Linked Frameworks and Library" section. I then created a module.map file in my project, like this:

module GoogleConversionTracking {
    header "../../Libs/GoogleConversionTrackingSDK/ACTReporter.h"    
    export *
}

And in Swift files I can now refer to it:

import GoogleConversionTracking

But I get an error at link time:

ld: library not found for -lGoogleConversionTracking
clang: error: linker command failed with exit code 1 (use -v to see invocation)
note: library not found for -lGoogleConversionTracking

How do you fix this? I would like to not use a bridging header, but instead use these module definition files, if possible.

like image 287
Rob N Avatar asked Sep 26 '17 20:09

Rob N


People also ask

How can I use .a static library in Swift?

Yes, you can use static libraries in Swift. Go to your Build Phases and under "Link Binary With Libraries" and add them there. Alternatively, you can go under Build Settings and in "Search Paths" append the "Library Search Paths" value to include the path to the folder that your . a file is in.

Does Swift support static libraries?

Question: Can we create static frameworks using Swift? Answer: Finally, YES! (Xcode 9). CocoaPods announced the support of Swift Static Frameworks in 1.5.

How do I import a static library?

Link Static Library to your AppRight-click on your libStaticLibrary. a choose Show in Finder, copy files and put them to a created new folder which the name “lib” in the root folder of your project. Create new single view application or open your project where you want to use your library.

What is static library in Swift?

What is a static library? A static library is a collection of compiled source code files. Let's say we have FileA. swift , FileB. swift and FileC.


1 Answers

Module map is my synonym for trouble! Bridging headers suck, but they just work in most cases. Anyways, make sure to:

  • Configure SWIFT_INCLUDE_PATHS – a list of paths to be searched by the Swift compiler for additional Swift modules. This tells Xcode where your module maps are.
  • Configure LIBRARY_SEARCH_PATHS – this is a list of paths to folders to be searched by the linker for libraries used by the product. Xcode still needs to know where binaries for your modules are.

Also, you probably want to use the umbrella header, not just header, see documentation. I'd also suggest using modulemap extension, not sure if module.map makes difference, but that's how I remember seeing and using it in most projects.

Omar Abdelhafith has a wicked blog post on this matter and it also helps to see how others do it when dealing with those kind of things.

like image 150
Ian Bytchek Avatar answered Oct 24 '22 05:10

Ian Bytchek