Poco库1.4.6 Xcode 5构建iPhone模拟器版本

4

我曾使用Poco库1.4.5-all,在最近将我的Xcode升级至5.0.1后,我遇到了关于iPhone设备构建的Poco库链接问题。通过使用最新的Poco库(poco-1.4.6p2-all),我成功地解决了iPhone设备的链接问题。

由于Xcode5.0.1没有命令行的llvm支持,因此我需要按如下方式为iPhone设备构建Poco库。(在“build/config/iPhone-clang-libc++”文件中更改CXXFLAGS以与openssl库链接)

./configure --config=iPhone-clang-libc++  -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL 
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=arm64 -s -j4
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 -s -j4
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv6 -s -j4

在构建 iPhone 设备时,它能正常工作。

问题出现在构建 iPhone 模拟器时。有很多“Undefined symbols for architecture i386”的错误。

以下是我为 iPhoneSimulator 构建 Poco 库所做的操作。

我执行了以下命令。

./configure --config=iPhoneSimulator-clang-libc++  -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL 
make

结果出现问题。(有很多“Undefined symbols for architecture i386”的错误。)

我检查了这两个库之间的差异。'nm'工具的结果如下。

i686 (有问题)

00000050 T __ZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEE
000001e8 S __ZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEE.eh
00000198 s __ZZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEEE6digits

armv7(可行)

0000001c T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000280 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000228 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits

这能成为解决问题的线索吗?

有人成功地构建了iPhone模拟器吗?

提前感谢。 Bruce。

2个回答

0

我成功地为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' 并像这样注释掉它

# OSFLAGS            = -arch $(POCO_TARGET_OSARCH) -isysroot $(IPHONE_SDK_BASE) -miphoneos-version-min=$(IPHONE_SDK_VERSION_MIN)

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}"                 

就这些了。


0

对于运行OSX10.8 + XCode5的人来说,Mavericks解决方案并不适用。我找到了另一种替代方案。

另一个选择是使用clang编译器。我还没有测试过,请小心谨慎。它似乎可以编译..除此之外就不确定了

在poco目录中打开build/config/iPhone,并将CC和CXX替换为以下内容:

CC              = $(shell xcrun -find -sdk iphoneos clang)
CXX             = $(shell xcrun -find -sdk iphoneos clang++)

我在这里找到了一个解决方案here


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