【C++】POCO学习总结(二十):交叉编译poco-1.12.5p2

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值