如何在Swift中使用静态库和模块映射文件?
问题描述:
我想在我的Swift项目中包含第三方静态库。我有这两个文件,以及其他几个文件。如何在Swift中使用静态库和模块映射文件?
GoogleConversionTrackingSDK/ACTReporter.h GoogleConversionTrackingSDK/libGoogleConversionTracking.a
我加入了.a
文件到目标的“链接的框架和库”部分。然后我创建了一个module.map
文件在我的项目,像这样:
module GoogleConversionTracking {
header "../../Libs/GoogleConversionTrackingSDK/ACTReporter.h"
export *
}
而且在斯威夫特文件,我现在可以参考一下吧:
import GoogleConversionTracking
但我在链接时出现错误:
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
你如何解决这个问题?如果可能,我想不使用桥接头,而是使用这些模块定义文件。
答
模块图是我麻烦的代名词!桥接标题吸引人,但他们只是在大多数情况下工作。无论如何,请确保:
- 配置
SWIFT_INCLUDE_PATHS
- Swift编译器为其他Swift模块搜索的路径列表。这告诉Xcode你的模块地图在哪里。 - 配置
LIBRARY_SEARCH_PATHS
- 这是链接器为产品使用的库搜索的文件夹的路径列表。 Xcode仍然需要知道你的模块的二进制文件在哪里。
此外,您可能想要使用伞头,而不是头,请参阅documentation。我还建议使用modulemap
扩展名,不确定module.map
是否有所不同,但这是我记得在大多数项目中看到和使用它的方式。
Omar Abdelhafith在这方面有一个恶作剧blog post,在处理这些事情时也可以看到how others do it。