我成功地为iPhone设备和iPhone模拟器构建了正确的版本。
尽管Xcode5.0.1不支持命令行的llvm,但是你可以下载“Maverick的命令行工具”。如果你安装了它,那么你就可以使用llvm。因此,你可以使用“iPhone”和“iPhoneSimulator”的构建配置(无需使用“iPhone-clang-libc++”和“iPhone-clang-libc++”配置)
而且,“nm”工具能够正确地显示问题所在。当我为iPhone模拟器构建时,出现了一些问题。
因此,我将向您展示这些问题的快速解决方法。
1)进入您下载的“poco-1.4.6p2-all”目录
2)打开build/config/iPhone文件
vim build/config/iPhone
3) 并更改以下两行
CC = $(shell ls $(TOOL_PREFIX)/llvm-gcc-$(GCC_VER)* | tail -1)
CXX = $(shell ls $(TOOL_PREFIX)/llvm-g++-$(GCC_VER)* | tail -1)
转换成这个
CC = /usr/bin/llvm-gcc
CXX = /usr/bin/llvm-g++
这是因为原始脚本尝试在错误的位置调用“llvm-gxx”。
“Maverick的命令行工具”将在“/usr/bin”目录中为“llvm-gxx”创建符号链接。
很抱歉,脚本不够美观,但是它是硬编码的。
4)找到“CXXFLAGS”,并指定“openssl”包含和库目录,如下所示。
(当然,您需要事先构建它。)
CXXFLAGS = $(OSFLAGS) -Wall -Wno-sign-compare -L(Your openssl source directory)/lib/iOS -I(Your openssl source directory)/include
5) 现在你已经完成了配置文件的设置。保存并关闭。
6) 接下来,打开 build/config/iPhoneSimulator 文件。
vim build/config/iPhoneSimulator
7) 找到 'OSFLAGS' 并像这样注释掉它
8) 完成。保存并关闭。
9) 现在执行以下命令来为“iPhone”设备构建库。
./configure --config=iPhone -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 -s -j4
如果您需要为其他架构构建库,请添加它。
10)完成。现在执行以下命令以构建“iPhoneSimulator”库。
make clean
./configure --config=iPhoneSimulator -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=i686 -s -j4
上面的最后一行,并且更改为构建配置文件是我的问题的解决方案...我对编译器和链接器的东西不是很了解,所以我不确定原始脚本的问题是什么。
11) 完成。最后,像这样比较这两个库的内容。
nm lib/iPhoneOS/armv7/libPocoFoundation.a | grep digestToHex
nm lib/iPhoneSimulator/i686/libPocoFoundation.a | grep digestToHex
你应该看到编译后的C++函数'digestToHex'的签名与此示例完全相同。
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $ nm lib/iPhoneOS/armv7/libPocoFoundation.a | grep digestToHex [ruby-1.9.3-p125]
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
0000001c T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000280 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000228 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $ nm lib/iPhoneSimulator/i686/libPocoFoundation.a | grep digestToHex [ruby-1.9.3-p125]
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
00000050 T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000268 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000218 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $
12) 如果你需要“fat library”,那么可以在终端中调用“lipo”命令。例如,你可以创建一个简单的shell脚本,重复执行以下命令来处理所有的*.a文件。
lipo -create -output "${UNIVERSAL_DIR}/${FILE1}" "${SIMULATOR_DIR}/${FILE1}" "${ARMV7_DIR}/${FILE1}"
就这些了。