1、版本说明
1.1 poco-1.13
截止2024-07-03,POCO的稳定版本最高为poco-1.13.3,注意从poco-13.0开始需要编译器支持C++17,否则编译时报错。
常见报错有:
1)std::string的append重载版本问题,报错信息如下
no matching functiong for call to std::__cxx11::basic_string<char>::append(const string&, std::__cxx11::basic_string<char>::size_type)
这个错误是因为C++17中 std::string的append方法有重载接口:
void append(const std::string& str, size_t n); // 将str的前n个字符追加到当前字符串的末尾
但是C++11中 std::string的append方法没有该重载接口,因此报错。
2)找不到头文件 string_view
std::string_view 是 C++17 引入的一个类型,用于提供对字符串(如 std::string、字符数组等)的非拥有、只读视图。
1.2 poco-1.12.5p2
poco-1.12.5p2 是对 poco-1.12.5的bug的修复版本。需要编译器支持C++14 C11。
对版本的支持可以在源码目录下:build/config/下的文件中查看,比如交叉编译ARM-Linux中,可以见:
CFLAGS = -std=c11
CXXFLAGS = -std=c++14
1.3 其它版本
其它稳定版本的详细说明参见:https://github.com/pocoproject/poco/releases
1.4 GCC版本和C++版本
1)C++98
GCC 6.1之前版本的默认模式。
可以通过指定编译选项-std=c++98或-std=gnu++98来使用C++98标准。
2)C++11
从GCC 4.8.1版本开始完全支持。
可以通过指定编译选项-std=c++11或-std=gnu++11来使用C++11标准。
3)C++14
从GCC 6.1版本开始完全支持,并且是GCC 6.1到GCC 10(包括)的默认模式。
可以通过指定编译选项-std=c++14或-std=gnu++14来使用C++14标准。
4)C++17
从GCC 7版本开始完全支持,并且是GCC 11版本的默认模式。
可以通过指定编译选项-std=c++17或-std=gnu++17来使用C++17标准。
5)C++20
从GCC 8版本开始陆续支持C++20特性。
可以通过指定编译选项-std=c++20或-std=gnu++20(GCC 9及以前使用-std=c++2a)来使用C++20标准。
但请注意,GCC对C++20的支持可能还未完全成熟。
6)C++23
标准还在发展中。从GCC 11版本开始支持C++23特性。
可以通过指定编译选项-std=c++2b或-std=gnu++2b来使用C++23的初步支持。
2、移植POCO
2.1 版本选择
本人ARM的GCC版本为6.2.1,默认支持C++14,对应POCO最高的版本为poco-1.12.5p2
2.2 依赖库
POCO最小版本(–minimal, 最小版)支持:基础库FUoundation、XML、JSON、Util、Net
POCO默认版本(–typical,典型版本)支持:基础库FUoundation、XML、JSON、Util、Net、Cyrpto、NetSSL、Data、Zip
POCO完整版本(–everything)支持全部功能
POCO最小版本不需要依赖;
POCO默认版本依赖openssl、zlib、MySQL、ODBC、PostgreSQL等库
2.3 编译minimal版
1)修改配置文件
进入源码目录,修改 build/config/ARM-Linux 中 TOOL变量为交叉编译链的前缀:arm-linux-gnueabihf
TOOL ?= arm-linux-gnueabihf
2)执行配置
进入源码目录,执行如下
./configure --config=ARM-Linux --no-test --prefix=/home/laoer/install --shared --static
3)编译、安装
make -j8
make install
2.4 编译typical版(默认版)
2.4.1 编译 openssl
1)源码下载
openssl最好使用1.0.2及以上版本,否则在编译poco-1.12.5时报错:找不到:X509_check_host、X509_check_ip_asc。
这两个接口是在 openssl-1.0.2 引入的
对这个问题的分析可能有误:使用openssl-1.1.1版本也会报错,编译poco时,如果选择编译静态库(–static),在编译示例(make samples)时,总是也报错
本次尝试使用 openssl-1.1.1
官网最新版本下载:https://www.openssl.org/source/index.html
官网历史版本下载:https://www.openssl.org/source/old/index.html
2)配置
不要在交叉编译环境中,即不运行类似sourc sdk/linux-devkit/environment-setup命令,否则报错:perl: XXXX failed
进入源码中,执行配置:
./config no-asm --prefix=/home/laoer/install --cross-compile-prefix=arm-linux-gnueabihf-
3)编译、安装
make -j8
make install
2.4.2 编译zlib
1)源码下载
官网下装源码:https://zlib.net/
从POCO11.8开始支持zlib-1.3.x,目前(2024-07-03)zlib最新版本为1.3.1,可以尝试使用最新的版本。
zlib1.3.1下载:https://zlib.net/zlib-1.3.1.tar.gz
2)配置
交叉编译前,加载交叉编译环境,例如:source sdk/linux-devkit/environment-setup
环境变量中,会配置好CC、CFLAGS等变量,根据自己的环境来设置。
设置好环境变量,在配置zlib时,只需指定安装目录即可,因为是交叉编译,默认会安装到系统中,因此设置安装目录还是有必要的。
执行:
./configure --prefix=/home/laoer/install
在打印信息中,可以看到arm-linux-gnueabihf-gcc字样,说明交叉编译环境是正确的。
Checking for shared library support...
Building shared library libz.so.1.3.1 with arm-linux-gnueabihf-gcc.
Checking for size_t... Yes.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.
3)编译、安装
make -j8
make install
2.4.3 编译POCO
1)修改配置文件
进入源码目录,修改 build/config/ARM-Linux 中 TOOL变量为交叉编译链的前缀:arm-linux-gnueabihf
TOOL ?= arm-linux-gnueabihf
2)执行配置
进入源码目录,执行如下,注意:这里没有选择编译静态库(–static),因为在编译samples时,总是报和 openssl 相关的错误。
./configure --config=ARM-Linux --no-test --prefix=/home/laoer/install --shared \
--omit=Data/PostgreSQL,Data/ODBC,Data/MySQL \
--include-path=/home/laoer/install/include \
--library-path=/home/laoer/install/lib
3)3)编译、安装
make -j8
make install