如何在Linux系统中编译并使用POCO库

本文描述了在Linux系统中编译POCO库,并且包括了交叉编译方法。这样不管是PC端,还是嵌入式端都可以使用强大的POCO库。

上期描述了如何在Windows中编译使用POCO库,有兴趣请点此进入

下载POCO库

下载POCO库的Linux版本,点此进入下载页面,选择Basic Edition右边的Sources for Linux,OS X,etc开始下载。如果需要用到OpenSSL,数据库访问等高级功能时,可以选择Complete Edition版本。

解压POCO库

在Linux终端中进入到POCO库包文件的目录,运行以下命令(粗体部分):

# tar xvf poco-1.9.0.tar.gz

命令执行完成后,进入到该文件夹中,准备开始编译。

编译前的准备

POCO库体系在Linux平台下有一套自己的编译体系,我们直接使用即可,不管是POCO库本身,还是我们自己的使用了POCO库的应用程序或者是库。这套编译体系是基于make设计的。所以我们需要在Linux平台中安装make,gcc,g++等基本编译工具。如果是基于ubuntu或者debian平台,也就是任何使用了apt包管理器的系统,可以运行以下命令安装这些工具。

sudo apt update
# sudo apt install build-essential

等待安装完成。如果要验证工具是否正确安装,可以使用命令

# whereis gcc make

# gcc -v

# make -v

如果正确安装,这些命令都会有相应的输出。

开始编译

前面已经解压了POCO库,并已经进入到了源代码的目录中,相应的工具也已经准备完成,接下来就可以开始编译,首先需要配置Makefile。运行以下命令

# ./configure

如果是Complete Edition版本的,系统也没有设置相应的OpenSSL,MySQL等依赖,可以先忽略这些功能的编译,使用以下命令

./configure –omit=Data/ODBC,Data/MySQL,NetSSL_OpenSSL,Crypto

如果是Basic Edition,直接忽略提供参数–omit这一步,源代码并不包含这些功能的代码。

如果不需要测试和例子代码,提供参数 –no-tests –no-samples 给configure,这样可以减少编译的时间。

配置完成后,运行命令

# make

开始编译,如果是多核机器,可以加上-j4参数开始四个并行的编译进程。默认make一次执行一个任务。

等编译完成。

编译的库会在当前目录的lib目录下,库按操作系统和指令集位数分类了。例如我的目录架构是:lib/Linux/x86_64/。因为是跨平台库,所以分类很有必要。

使用POCO库

总共有两种使用方式,一种是在POCO源代码树下创建我们自己的代码目录,和Foundation目录平级。这种不需要额外的配置,只需要提供一个Makefile,使用POCO定义的规则描述编译规则,然后代码编写完成后,直接使用make编译即可。另外一种是在POCO源代码树之外,使用POCO库编译体系的编译方式,但是需要额外配置。本文先讲简单的方式,后面如果有时间,会单开一遍文章讲述如果在POCO源代码树之外创建自己的代码目录并使用POCO编译体系进行编译的方法。

首先在POCO源代码目录中创建HelloWorld目录,名字可以随便起,此处只是示例。在HelloWorld目录中创建一个src目录,在src目录中创建hello_world.cpp文件,在HelloWorld目录中创建Makefile文件。注意,所有的代码文件(*.cpp,*.c等)必须包含在src目录中,所有的头文件(*.h,*.hpp等)必须包含在include目录中。

在hello_world.cpp中输入代码:

#include “Poco/ByteOrder.h” // POCO库字节序头文件

#include <iostream>

using Poco::ByteOrder;// POCO库命令空间引用

using Poco::UInt16;
int main(){

#ifdef POCO_ARCH_LITTLE_ENDIAN

std::cout << “little endian” << std::endl;

#else

std::cout << “big endian” << std::endl;

#endif

UInt16 port = 80;

UInt16 networkPort = ByteOrder::toNetwork(port);

return 0;

}

代码编译可以使用类似vim,nano,gedit,等任何文本编辑工具。

nano编辑截图

nano_helloworld_edit

目录结构及文件如下:

nano_helloworld_edit2

接下来在Makefile中添加如下内容:

#
# Makefile for a execute
#

include $(POCO_BASE)/build/rules/global

objects = hello_world

target = HelloWorldFromPoco
target_libs = PocoFoundation

include $(POCO_BASE)/build/rules/exec

其中 objects = hello_world中hello_world其实是hello_world.cpp省略了.cpp的写法,POCO能自动识别。

target=HelloWorldFromPoco指定应用程序的名称,名称任意指定。

target_libs = PocoFoundation,此处指定依赖的POCO库,有多个时,空格分开就可以。

两条include表示加入POCO编译体系的依赖。

接下来回来上级目录,即回来POCO源代码的顶层目录,修改Makefile文件,添加HelloWorld的编译配置:

HelloWorld-libexec: Foundation-libexec
          $(MAKE) -C $(POCO_BASE)/HelloWorld

HelloWorld-clean:
          $(MAKE) -C $(POCO_BASE)/HelloWorld clean

将以上配置加到Net-clean:规则下方即可。注意$(MAKE)前面使用tab键添加空白。网页编辑的时候不能使用tab增加缩进,所以用的空格代替。如下图所示:

nano_helloworld_edit3.png

接下来将HelloWorld-libexec和HelloWorld-clean添加到libexecs规则和cleans规则。如下图所示:

nano_helloworld_edit4.png

这样,我们在顶层目录编译的时候,HelloWorld也会一起编译。

在POCO库源代码顶层目录中运行命令:

# make

命令运行完成后,将会在HelloWorld目录中创建两个目录,bin,lib。

bin目录下为执行程序文件,lib目录下为代码文件的.o文件。

进入到bin目录中,会有操作系统和i386或者x86_64等目录,依各位的操作系统而定,最终目录会存在HelloWorldFromPocod和HelloWorldFromPoco文件。

执行这两个文件会输出 :

little endian

表示我们开始的应用程序,使用POCO库的编译体系成功构建出来了。

交叉编译

如果有需要交叉编译的小伙伴,可以使用交叉编译变量设置交叉编译工具链的名称。前提是需要明白交叉工具链如果设置,一般在为嵌入式设备开发应用程序的时候,嵌入式硬件厂商会提供编译工具的。也会有详细说明PC主机如何设置交叉编译工具。本文假设交叉工具链已经设置完毕,而给出的交叉编译方法:

很简单,只需要在make前面加上CROSS_COMPILE=arm-linux-即可,例如:

# CROSS_COMPILE=arm-linux- make

执行此命令前,如果编译过其它的版本,需要先使用清理命令

# make clean

再运行上述交叉编译命令,两个平台的二进制不兼容的。

这里的arm-linux-不是特定的模式,根据交叉编译命令而得出的,比如我的机器上的arm架构编译工具名称是arm-linux-gcc,这是处于环境变量PATH后面的一个执行程序。如果没有PATH指定工具路径。则需要手动指定/path/to/arm-linux-gcc。如果您的命令是其它形式,替换掉arm-linux-即可。

如果有小伙伴不懂如何设置交叉编译,而又想知道的,可以在评论留言,我会看留言数决定是否需要单开一篇文章讲述如何搭建交叉编译环境。

谢谢阅读!

我要打赏,谢谢支持!

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s