编译-POCO C++支持iOS平台的静态库

一、POCO C++ library简介

POCO C++ library是一个C++编写的跨平台库,主要实现网络连接、数据库管理以及服务器,适用于跨平台、嵌入式。

二、为Xcode编译POCO C++ 静态库

1、确定需要编译的版本

要想使POCO C++在iOS的各个平台上运行,那么需要针对各个平台的不同架构进行编译,因此我们需要了解iOS各个平台的架构,主要分为iPhone模拟器、iPhone真机以及运行Xcode电脑本身的架构。

(1)iPhone模拟器

*iPhone5及以下版本的模拟器的架构是i386;

*iPhone5s及以下版本的模拟器的架构是x86_64;

(2)iPhone真机的架构:armv7,armv7s和arm64;

(3)OSX的架构:x86_64;

根据需要选择要支持的架构:
  iOS 架构:armv7,armv7s,arm64、i386,x86_64。
  OSX 架构:电脑x86_64。

2、编译器选择

一般来说,在POCO的配置的编译脚本中都不需要我们手动配置编译器,脚本命令会自己找到对应的编译器。例如poco/build/config/iPhone中

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

这个代码就能找到Xcode自带的C语言clang编译器、C++clang++编译器。

查看clang/clang++ 的路径的命令:所以这里不需要修改

lxx-Mac-mini:~ suning$ xcrun -find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

lxx-Mac-mini:~ suning$ xcrun -find clang++
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++

编译器应设置为Xcode自带的编译器。修改编译器的方法是:用文本编辑器打开需要修改的config文件,例如poco/build/config/iPhone,将原来的CC与CXX修改为Xcode自带的编译器的路径,例如:

CC=/Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

CXX=/Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++

3、编译静态库(重要)

阅读官网文档:https://pocoproject.org/index.html
(1)从官方文档网站可以得到

获取信息:用–omit去掉一些依赖、./configure --help 可以查看更多命令
可能依赖OPENSSL

./configure --omit=Data/ODBC,Data/MySQL

(2)把下载下来的源代码解压到桌面;

得到源码后几个文件要多看看:README.md README configure  config.make
以及路径 :桌面/poco-master/build/config/ 中的文件各个平台的编译配置脚本

(3)打开终端,进入源代码文件,针对不同的平台架构运行下面的命令:

一、armv7:

修改点用户名:–prefix=/Users/suning/Desktop/Xcode-poco/armv7

$ ./configure --config=iPhone-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/openssl/include --prefix=/Users/"用户名"/Desktop/Xcode-poco/armv7

$ make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 install

如果openssl位置不对,会报错openssl找不到

解决openssl依赖

  • Mac 查看openssl 版本
$ openssl version
LibreSSL 2.6.5
  • 没有则安装依赖:
brew install openssl
  • 查看openssl位置
$ brew --prefix openssl
/usr/local/opt/openssl

保证参数正确:–include-path=/usr/local/opt/openssl/include

修改后的执行命令

$ ./configure --config=iPhone-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/armv7

$ make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 install

错误:

  • 多个依赖文件JSON…等没有成功
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C /Users/suning/Desktop/poco-master/JSON
make[1]: Nothing to be done for `all'.
...
  • -fembed-bitcode 版本问题
clang: error: -fembed-bitcode is not supported on versions of iOS prior to 6.0
make[1]: *** [/Users/suning/Desktop/poco-master/PageCompiler/bin/iPhoneOS/armv7/static/cpspcd] Error 1
make: *** [PageCompiler-libexec] Error 2

修改:IPHONE_SDK_VERSION_MIN=7.0

$ make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=armv7 install

等待编译…几分钟后结束。

ld: -bind_at_load and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [/Users/suning/Desktop/poco-master/PageCompiler/bin/iPhoneOS/armv7/static/cpspcd] Error 1
make: *** [PageCompiler-libexec] Error 2

这个错误不清楚什么意思,好像是/poco-master/PageCompiler/bin/路径下的,好像没有影响。

查看库信息

来查看库文件所支持的架构,例如需要查看libPocoData.a所支持的架构,可以使用下面的命令:lipo -info libPocoData.axxx/Desktop/poco-master/lib/iPhoneOS/armv7
在这里插入图片描述

二、armv7s

./configure --config=iPhone-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/armv7s


make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=armv7s install

三、armv7s

./configure --config=iPhone-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/arm64
make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=arm64 install

四、i386

./configure --config=iPhoneSimulator-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/i386

make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=i386 install

五、iPhoneSimulator-x86_64

./configure --config=iPhoneSimulator-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/x86_64

make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=x86_64 install

六、Darwin64

./configure --config=Darwin64-clang-libc++ --no-tests --no-samples --omit=Data/MySQL,Data/ODBC --static --include-path=/usr/local/opt/openssl/include --prefix=/Users/suning/Desktop/Xcode-poco/Darwin64

make IPHONE_SDK_VERSION_MIN=7.0 POCO_TARGET_OSARCH=Darwin64 install

说明:

–config 配置编译脚本,由于Xcode的C和C++编译器是clang和clang++,因此选择iPhone-clang-libc++脚本;
–no-tests和–no-samples 表示不编译tests文件和samples文件
–omit 在这里面配置自己不需要的库文件
–include-path 用来配置依赖信息,在这里,由于Crypto和 NetSSL_OpenSSL模块依赖于openSSL,因此需要配置openSSL的路径
–static 表示建立静态库文件
----prefix 配置编译好的库文件的存放位置
IPHONE_SDK_VERSION_MIN 设置支持的iPhone的SDK的最低版本
POCO_TARGET_OSARCH 设置平台的架构信息

制作通用库文件

可以利用Xcode的lipo命令来制作,其格式如下:

lipo -create armv7/lib/libPocoData.a arm64/lib/libPocoData.a -output iOS/lib/libPocoData.a

⚠️注意:由于Darwin64的架构和iPhoneSimulator-x86_64是相通的架构,因此不能将他们合并在一起。

验证合并后的库:lipo -info libPocoData.a

BUILDING WITH CMAKE

README文件中介绍了CMAKE 编译方法,要把下载的openssl 放到poco的root/openssl中
不然找不到openssl

The POCO C++ Libraries support CMake as a build system on Linux, macOS and Windows.
To build the POCO C++ Libraries with CMake:

  1. create a cmake-build directory (e.g. in the POCO root directory):

$ mkdir cmake-build

  1. and run CMake from there:

$ cd cmake-build
$ cmake …
$ make -s -j

生成的是arm64的。

修改搜索路径

可以通过修改环境变量,将openssl的库路径和头文件路径可以写入系统路径,这样写gcc命令的时候 -I和 -L可以省写在~目录下打开.bash_profile写入

vim ~/.bash_profile
export CPATH=/usr/local/opt/openssl/include
export LIBRARY_PATH=/usr/local/opt/openssl/lib

更新刚配置的环境变量

source .bash_profile

补充

iOS中动/静态库支持bitcode的问题

-fembed-bitcode-marker会生成一个最小bitcode的section,但是没有任何内容,size=1-fembed-bitcode则会生成bitcode的相关内容

参考:
iOS——为Xcode编译POCO C++静态库

发布了249 篇原创文章 · 获赞 224 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/shifang07/article/details/102561648