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 模拟器构建。有很多“架构 i386 的未定义符号”错误。

这就是我为 iPhoneSimulator 构建 Poco 库所做的。

我触发了以下命令。

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

结果是有问题的。(有很多“架构 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

这可以成为这个问题的线索吗?

有没有人成功为 iPhoneSimulator 构建?

提前致谢。布鲁斯。

4

2 回答 2

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++)

我在这里遇到了这个解决方案

于 2013-11-11T18:26:04.573 回答
0

我设法为 iPhone 设备和 iPhoneSimulator 正确构建。

尽管 Xcode5.0.1 不支持命令行的 llvm,但您可以下载“Maverick 命令行工具”。如果你安装它,那么你可以使用 llvm。因此,您可以为“iPhone”和“iPhoneSimulator”使用构建配置(无需使用“iPhone-clang-libc++”和“iPhone-clang-libc++”配置)

并且“nm”工具正确显示了问题。当我为 iPhoneSimulator 构建时出现了问题。

因此,我将向您展示这些问题的快速解决方案。

1)转到您下载的“poco-1.4.6p2-all”目录

2) 打开构建/配置/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'包含和lib目录。(当然,您需要事先构建它。)

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'命令。例如,您可以为所有 *.a 文件重复触发以下命令的简单 shell 脚本。

lipo -create -output "${UNIVERSAL_DIR}/${FILE1}" "${SIMULATOR_DIR}/${FILE1}"  "${ARMV7_DIR}/${FILE1}"                 

就这样。

于 2013-10-30T13:00:48.543 回答