从C ++库创建一个Swift共享框架

时间:2018-02-19 20:08:39

标签: c++ ios swift cmake

我有一个为iOS交叉编译的C ++共享库,我想将它包装到一个共享框架中。我的想法是这个库应该在后台线程中运行服务器,而一些Swift代码连接到它。

在我看来,共享框架正是我想要的,但我无法弄清楚如何创建它以及相应的桥接头,以便能够从Swift启动服务器。

理想情况下,我想在this documentation之后从CMake创建它。但是,在我看来,当我这样做时,链接器完全忽略了我的框架(我只设置了FRAMEWORKFRAMEWORK_VERSION,但我不认为这是它的原因。忽略)。我做了这样的事情:

add_library(dynamicFramework SHARED
        dynamicFramework.c
)
set_target_properties(dynamicFramework PROPERTIES
    FRAMEWORK TRUE
    FRAMEWORK_VERSION C
)

我还试图从Xcode创建一个共享框架并在其中添加我的C ++共享库,但是当我的C ++库为30M时,生成的框架二进制文件是50K,所以我想它并没有真正把它放在Framework中

是否有任何关于此的文件表明理论上甚至可以实现这一目标?

1 个答案:

答案 0 :(得分:1)

您应该使用nm检查框架二进制文件,例如:nm MyLib.framework/MyLib。它将显示框架中包含的所有符号。所以你可以查看缺少的东西。

您可以使用以下命令创建共享库:

xcrun --sdk iphoneos clang -arch armv7 -arch arm64 -c -o hello_arm.o hello.c
xcrun --sdk iphonesimulator clang -arch i386 -arch x86_64 -c -o hello_x86.o hello.c
xcrun --sdk iphoneos ld -arch_multiple -arch arm64 -arch armv7 -dylib -dynamic -all_load -no_arch_warnings -dylib_install_name libhello_arm.so -ios_version_min 11.0 hello_arm.o -o libhello_x86.so
xcrun --sdk iphonesimulator ld -arch_multiple -arch i386 -arch x86_64 -dylib -dynamic -all_load -no_arch_warnings -dylib_install_name libhello_arm.so -ios_version_min 11.0 hello_arm.o -o libhello_arm.so
xcrun --sdk iphoneos lipo libhello_arm.so libhello_x86.so -create -output libhello.so

现在,您可以通过根据Bundle Programming Guide创建目录结构,从共享库创建共享框架:

 MyFramework.framework/
     Headers/
     Base.lproj/
     de.lproj/
     en.lproj/
     Info.plist
     MyFramework

其中MyFramework文件是上面创建的共享库。