如何为iPhone构建Boost库

17

有人可以告诉我在哪里找到详细的指南,如何构建Boost库以在iPhone设备上使用。

我已经为Mac构建了这些库,并且可以在我的项目中使用(仅在iPhone模拟器上)。在为iPhone设备构建项目时,XCode会出现警告:“文件不符合所需的架构”和一些其他错误。

请帮忙。

6个回答

5
对于只有头文件(.hpp)的boost库,您可以将项目中的头文件搜索路径设置为它们。
对于具有源代码的boost库,您可以通过以下简单步骤为iOS手机/模拟器构建静态库:
1. 下载和解压缩boost发行版存档(来自https://www.boost.org/users/download/),例如:https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.bz2 2. 运行bootstrap.sh并指定需要构建的库,例如'context'(格式=library1,library2,...):
./bootstrap.sh --with-libraries=context

将正确路径下已安装的 SDK 添加到 project-config.jam 的工具集中:
# IOS ARM64
using clang : iphoneos
: xcrun clang -arch arm64 -stdlib=libc++ -std=c++11 -miphoneos-version-min=12.0 -fvisibility-inlines-hidden -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
;

# IOS x86_64
using clang : iphonesimulator
: xcrun clang -arch x86_64 -stdlib=libc++ -std=c++11 -miphoneos-version-min=12.0 -fvisibility-inlines-hidden -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
;

创建并运行 build.sh 脚本(其中库名称为 libboost_.a):
lib=libboost_context.a
dir='stage/lib'

# Build arm64
./b2 -a -j4 toolset=clang-iphoneos binary-format=mach-o abi=aapcs link=static stage
mv $dir/$lib $dir/arm64_$lib

# Build x86_64
./b2 -a -j4 toolset=clang-iphonesimulator binary-format=mach-o abi=sysv link=static stage
mv $dir/$lib $dir/x86_64_$lib

# Make fat
lipo -create $dir/arm64_$lib $dir/x86_64_$lib -output $dir/$lib

现在,您在“/stage/lib”目录中有以下编译好的静态库文件,用于boost context: arm64_libboost_context.ax86_64_libboost_context.a 和合并后的 libboost_context.a

5

使用iPhone静态库项目模板在Xcode中启动一个新项目。 然后导入源代码和头文件,并进行编译。结果应该是一个适用于iPhone的静态库。


谢谢,这很好用,而且非常简单 :) 现在,我为模拟器构建的库在模拟器上无法工作。 例如,错误信息:“boost :: regex_error的typeinfo”,引用自:... - Nobik
根据库的不同(我之前从未使用过Boost),您可能需要进行一些小的代码更改才能使其正常工作...另外,请确保您已经设置了正确的链接器和编译器标志。 - Jasarien

3
我从这里开始: http://lists.boost.org/boost-build/2009/02/21326.php 对于大多数 Boost 库,你可能不需要实际编译它,只需包含有用的头文件。在我的情况下,我只需在自己的 Xcode 项目中进行编译器定义即可。

非常好的建议,只需包含Boost而不是编译它,为我节省了很多时间! - Nestor

2

嘿,我在我的openFrameworks插件中更新了Pete Goodliffe的脚本:

  • 目前支持arm64、armv7、i386、x86_64
  • Boost 1.59.0或更早版本
  • libc++/std=c++11 -- 现在可选发布libstdc++
  • 预编译和自行构建的脚本(因此如果您需要libstdc++,很容易更改)
    • 支持Xcode 7

[https://github.com/danoli3/ofxiOSBoost][1]


谢谢您,您的构建脚本非常有帮助! - avtomaton

1

之前的答案帮助了我想要为arm模拟器构建boost。当你拥有一台配备M1处理器的Mac并想要使用模拟器时,你不能使用iPhone的arm64构建。

我将这个添加到project-config.jam中:

# IOS Arm Simulator
using clang : iphonesimulatorarm64
: xcrun clang -arch arm64 -stdlib=libc++ -std=c++11 -miphoneos-version-min=10.0 -fvisibility-inlines-hidden -target arm64-apple-ios10.0-simulator -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk  ;

然后将toolset=clang-iphonesimulatorarm64传递给b2命令。


1
我们也使用boost。为了简化将其包含到新应用程序中,我创建了一个Xcode项目,您可以将其放入工作区以包含boost。它基于Makefile,因此您需要安装Xcode命令行工具。
该项目在这里 https://github.com/Cogosense/iOSBoostFramework
将项目克隆到您的工作区中,然后单击菜单File->"Add Files to workspace"。在文件查找器中选择iOSBoostFramework/iOSBoostFramework.xcodeproj,然后单击添加。
iOSBoostFramework目录中的Makefile控制构建内容和方式。支持Xcode工作区依赖项、位代码生成以及仅构建Xcode选择的目标架构。
以下库被构建:test、thread、atomic、signals、filesystem、regex、program_options、system date_time、serialization、exception、locale和random。
所有单独的库和架构都被合并,最终构建输出是一个FAT boost.framework框架捆绑包,可链接到应用程序中。
在Makefile中指定了boost的版本(当前为1.64.0),下载并为所有活动体系结构构建,在xcode指定的BUILT_PRODUCTS_DIR中安装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接