我有一个为iOS交叉编译的C ++共享库,我想将它包装到一个共享框架中。我的想法是这个库应该在后台线程中运行服务器,而一些Swift代码连接到它。
在我看来,共享框架正是我想要的,但我无法弄清楚如何创建它以及相应的桥接头,以便能够从Swift启动服务器。
理想情况下,我想在this documentation之后从CMake创建它。但是,在我看来,当我这样做时,链接器完全忽略了我的框架(我只设置了FRAMEWORK
和FRAMEWORK_VERSION
,但我不认为这是它的原因。忽略)。我做了这样的事情:
add_library(dynamicFramework SHARED
dynamicFramework.c
)
set_target_properties(dynamicFramework PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION C
)
我还试图从Xcode创建一个共享框架并在其中添加我的C ++共享库,但是当我的C ++库为30M时,生成的框架二进制文件是50K,所以我想它并没有真正把它放在Framework中
是否有任何关于此的文件表明理论上甚至可以实现这一目标?
答案 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
文件是上面创建的共享库。