`
zsxxsz
  • 浏览: 452032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

acl 的编译与使用

阅读更多

 

      acl 库的功能参见文章 acl介绍https://github.com/acl-dev/acl/,本文主要讲述如何编译和使用 acl 库。

      acl 库其实包含七个库:lib_acl (基础库)、lib_protocol(http 和 icmp 协议库)、lib_acl_cpp(封装了 lib_acl 和 lib_protocol 两个 C 库的 C++ 版本封装,更是增加了丰富的功能)、lib_fiber(功能强大的网络协程库,使开发者可以象使用 Go 语言一样快速编写基于协程的高并发服务应用)、lib_dict(封装了 bdb, cdb, Tokyo Cabinet 库的用于字典查询的库)、 lib_tls(封装了openssl部分功能的库,主要用于 lib_acl 的 ssl 加密传输)以及 lib_rpc(封装了 Google 的 protobuf 的库)。其中,笔者用的最多还是 lib_acl 、lib_protocol 以及 lib_acl_cpp(目前用得最多的库)三个库,所以本文主要介绍这三个库的编译与使用。

      acl 库目前支持 Linux、Solaris、FreeBSD、MacOS、IOS、Android 和 Windows 平台,欢迎读者将 acl 库移植至其它平台。

 

      一、Linux/UNIX 平台上编译(需要使用 gcc/g++编译器及 gnu make 命令)

      1、编译静态库

      1.1、编译 libacl.a 库(使用 gcc 编译器)

      进入 lib_acl 目录,直接运行 make,正常情况下便可在 lib 目录下生成 libacl.a 静态库,用户在使用 libacl.a 编写自己的程序时,需要在自己的 Makefile 文件中添加如下选项:

      1.1.1、编译选项:-I 指定 libacl.a 头文件所在目录(头文件在 lib_acl/include 目录下)

      1.1.2、链接选项:-L 指定 libacl.a 所在目录,-lacl 指定需要链接 libacl.a 库

      1.1.3、用户需要在自己的源程序中包含 lib_acl 的头文件,如下:

       #include "lib_acl.h"

       简单的 Makefile 示例:

test: main.o
	gcc -o test main.o -lacl -lz -lpthread -ldl
main.o: main.c
	gcc -O3 -Wall -c main.c -I./lib_acl/include

 

       1.2、编译 libprotocol.a 库(使用 gcc 编译器)

       进入 lib_protocol 目录,直接运行 make,正常情况下便可以在 lib 目录下生成 lib_protocol.a 静态库,用户在使用 lib_protocol.a 编写自己的程序时,需要在自己的 Makefile 文件中添加如下选项:

       1.2.1、编译选项:-I 指定 lib_protocol.a 头文件目录(在 lib_protocol/include 目录下)

       1.2.2、链接选项:-L 指定 lib_protocol.a 所在目录,-L 指定 lib_acl.a 所在目录,-l_protocol -l_acl

       1.2.3、用户需要在自己的应用程序中包含 lib_protocol 头文件,如下:

       #include "lib_protocol.h"

       简单的 Makefile 示例:

test: main.o
	gcc -o test main.o -lprotocol -lacl -lz -lpthread -ldl
main.o: main.c
	gcc -O3 -Wall -c main.c -I./lib_acl/include -I./lib_protocol/include

 

      1.3、编译 libacl_cpp.a 库(使用 g++ 编译器)

      进入 lib_acl_cpp 目录,运行 make static 编译 libacl_cpp.a 静态库,便可 lib 目录下生成 libacl_cpp.a,用户在使用 libacl_cpp.a 编写程序时,需要在自己的 Makefile 文件中添加如下选项:

      1.3.1、编译选项:-I 指定 libacl_cpp.a 头文件目录(在 lib_acl_cpp/include 目录下)

      1.3.2、链接选项:-L 指定 libacl_cpp.a 所在目录,-L 指定 libprotocol.a 所在目录,-L 指定 libacl.a 目录。如:-L./lib_acl_cpp/lib -lacl_cpp -L./lib_protocol/lib -lprotocol -L./lib_acl/lib -lacl,一定要注意这三个库的依赖关系:libprotocol.a 依赖于 libacl.a,libacl_cpp.a 依赖于 libprotocol.a 及 lib_acl.a,在使用 g++ 进行编译时必须保证库的依赖顺序,被依赖的库总是应放在后面,否则在链接程序时会报函数不存在。

      1.3.3、用户需要在自己的应用中包含 lib_acl.hpp 头文件,如下:

      #include "acl_cpp/lib_acl.hpp"

      简单的 Makefile 示例:

test: main.o
	g++ -o test main.o -lacl_cpp -lprotocol -lacl -lz -lpthread -ldl
main.o: main.cpp
	g++ -O3 -Wall -c main.cpp -I./lib_acl_cpp/include -I./lib_acl/include -I./lib_protocol/include

 

      如果程序仅用到了 libacl_cpp.a 库中类及函数,则只需要包含 libacl_cpp.a 的头文件即可,至于该库所依赖的 libprotocol.a 及 libacl.a 库的头文件已经做了特殊隐含处理,不必显式包含。

 

      2、编译动态库

      编译 libacl.so, libprotocol.so, libacl_cpp.so 的方式与编译静态库的方式有所不同,需要分别进入三个目录执行: make shared rpath=${lib_path},其中 shared 表示需要编译动态库,${lib_path} 需要用实际的目标路径替换,比如:make shared rpath=/opt/acl/lib,则会将动态库编译好后存放于 /opt/acl/lib 目录,编译这三个库的顺序为:libacl.so --> libprotocol.so --> libacl_cpp.so。

     另外,在编译 libacl_cpp.so 时,还需要提前编译在 resource 目录下的 polarssl 库,编译完后再编译 libacl_cpp.so 同时需要指定 polarssl.lib 库所在的路径;如果不需要 SSL 通讯方式,则需要打开 lib_acl_cpp/Makefile 文件,去年编译选项:-DHAS_POLARSSL。

 

     应用程序在使用这三个动态库时的头文件的包含方式与静态库的相同,连接动态库的方式与静态库类似,只是将 .a 替换成 .so 即可,同时也要求包含的顺序与上述静态库相同。如:

     a、编译时的头文件包含方式:-I/opt/acl/include/acl -I/opt/acl/include/protocol -II/opt/acl/include

     b、连接时的库文件包含方式:-L/opt/acl/lib -lacl_cpp -lprotocol -lacl

     c、运行时的库文件加载方式:-Wl,-rpath,/opt/acl/lib,该参数指定程序运行时需要加载三个动态库的位置在 /opt/acl/lib 目录下。

 

      3、编译成单一库

      为了方便使用,还提供了将以上三个库合成一个库的方法,在 acl 库目录下运行:make build_one,则会生成统一库:libacl_all.a 及 libacl_all.so,该库包含了 libacl,lib_protocol,lib_acl_cpp 三个库。则编写的 Makefile 就更为简单:

test: main.o
	g++ -o test main.o -lacl_all -lz -lpthread -ldl
main.o: main.cpp
	g++ -O3 -Wall -c main.cpp -I./lib_acl_cpp/include -I./lib_acl/include -I./lib_protocol/include

 

      4、使用 cmake 编译

      除以上使用 make 工具对 acl 库进行编译外,同时提供了使用 cmake 工具对 acl 库进行编译,编译过程非常简单:

$mkdir build
$cd build
$cmake ..
$make

 

      二、Windows 平台

      2.1 编译(vc2003/vc2008/vc2010/vc2012)

      在 acl 项目的根目录下,多个 VC 的工程文件,用户可根据自身需要打开工程文件:acl_cpp_vc2003.sln,acl_cpp_vc2008.sln,acl_cpp_vc2010.sln,acl_cpp_vc2012.sln(最早也支持VC6)。用户可以选择编译 lib_acl、lib_protocol、lib_acl_cpp 的静态库调试版、静态库发布版、动态库调试版以及动态库发布版,编译完成后,会在 acl\dist\lib\win32 目录生成的静态库有:

      lib_acl_vc20xxd.lib、lib_acl_vc20xx.lib、lib_protocol_vc20xxd.lib 和 lib_protocol_vc20xx.lib;
      生成的与动态库相关的文件有:lib_acl_d.dll/lib_acl_d.lib,lib_acl.dll/lib_acl.lib,lib_protocol_d.dll/lib_protocol_d.lib,lib_protocol.dll/lib_protocol.lib,lib_acl_cpp_d.dll/lib_acl_cpp_d.lib,lib_acl_cpp.dll/lib_acl_cpp.lib。

 

      2.2 使用

      a)在 win32 平台下使用 lib_acl 和 lib_protocol 静态库时,只需要在包含目录中添加 lib_acl/include、lib_protocol/include 以及 lib_acl_cpp/include 所在的路径,在链接时指定静态库路径及静态库名称。

      b)在 win32 平台下使用 lib_acl 的动态库时,不仅要做与 a) 中所指定的操作,而且需要在预处理器定义中添加:ACL_DLL;在使用 lib_protocol 的动态库,需要在预处理器定义中添加:HTTP_DLLICMP_DLL;在使用 lib_acl_cpp 的动态库时,需要在预处理器定义中添加:ACL_CPP_DLL

 

      三、 注意事项

      因为 lib_acl 是最基础的库,而 lib_protocol 依赖于 lib_acl,lib_acl_cpp 依赖于 lib_protocol 和 lib_acl,所在生成动态库时,需要注意生成顺序,编译顺序为:lib_acl,lib_protocol,lib_acl_cpp。

 

      个人微博:http://weibo.com/zsxxsz/

      acl 下载:https://sourceforge.net/p/acl/

      github 地址:https://github.com/acl-dev/acl/

      osc git 地址:https://git.oschina.net/acl-dev/acl

      原文地址

      更多文章

      QQ 群:242722074

0
0
分享到:
评论

相关推荐

    acl库,编译好的库文件

    在本例中,提供的“acl库,编译好的库文件”是一个已经预编译的版本,这意味着它可以直接被下载并使用,无需用户自行编译源代码。这对于开发者来说是一个极大的便利,因为编译过程可能涉及到许多依赖项和配置步骤,...

    交叉编译工具链.rar

    交叉编译工具链

    基于ACL会议模板的Latex双栏中文模板

    在本文中,我们将深入探讨如何使用基于ACL会议模板的LaTeX双栏中文模板来创建专业且规范的学术论文。ACL(Association for Computational Linguistics)是计算语言学领域的重要会议,其提供的模板旨在确保论文格式的...

    Acl.rar_ACL

    访问控制列表(Access Control List,简称ACL)是一种在网络及计算机安全领域中广泛使用的机制,用于实现对网络资源或文件系统的精细化访问控制。在操作系统和网络设备中,ACL允许管理员定义特定用户或用户组对特定...

    lua and acl example

    标题“lua and acl example”揭示了本主题是关于使用Lua脚本语言与Access Control Lists (ACL)相结合的一个示例。Lua是一种轻量级的、解释型的编程语言,常用于游戏开发、配置文件、服务器应用等领域。而ACL则通常...

    acl-master.zip

    acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...

    acl C++跨平台库.rar

    acl 库是啥、主要包含哪些功能? acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)...默认情况下,没有这些第三方库编译和使用 acl 库是没有问题的,只是不能使用 mysql/sqlite/ssl/protobuf 功能。

    acl-2.2.52.src.tar.gz

    安装和使用ACL工具,首先需要解压源代码包,然后运行`./configure`,接着是`make`来编译,最后通过`sudo make install`将编译好的工具安装到系统路径。在实际使用中,你需要熟悉`setfacl`和`getfacl`的语法,例如,`...

    acl.rar_ACL_control

    而`acl.h`则是一个头文件,它可能定义了ACL相关的数据结构、常量和函数原型,供其他模块在编译时引用,实现了代码的模块化和复用。 **4. ACL配置与管理** 在实际操作中,QEMU的ACL配置通常通过命令行参数或QEMU配置...

    acl-2.2.53.tar.gz

    总之,`acl-2.2.53.tar.gz` 是一个用于增强Linux和类Unix系统文件权限控制的软件包,通过解压、配置、编译和安装,我们可以利用其提供的工具和API实现更精细的访问控制策略,提升系统的安全性与管理效率。

    acl_mysql_util

    4. **预编译语句**:使用PreparedStatement来防止SQL注入,提高执行效率。 5. **游标处理**:允许逐行处理大数据结果集,减少内存消耗。 在ACL方面,这个库可能提供了以下功能: 1. **角色与权限定义**:创建、...

    acl-ijcnlp2021-templates.zip

    使用LaTeX模板,作者可以轻松地创建符合ACL标准的论文,包括标题页、摘要、正文、引用等部分。LaTeX的优势在于其强大的公式排版能力、自动化的引用管理和专业的文档格式化。 在"latex"文件夹中,可能包含以下文件:...

    ACL8112例程

    在使用ACL8112例程时,开发者通常会先阅读源代码(Util8112.c)了解数据采集的流程,然后配置和编译项目(Util8112.dsp或Util8112.dsw),最后运行Util8112.exe来验证数据采集功能。通过学习和修改这些文件,开发者...

    spring security3.0.4 的acl使用例子

    `PermissionEvaluator`用于判断用户是否有权限执行某个操作,而`AclService`是与ACL相关的操作接口,如读取、创建、更新和删除ACL信息。在Spring Security 3.0.4中,可以通过实现`PermissionEvaluator`接口来自定义...

    ACL 2011年会 latex模板

    9. **编译与预览**:LaTeX文档需要通过编译器(如pdflatex)转换为PDF,通常需连续编译多次以解决交叉引用和参考文献的问题。 10. **调试技巧**:当遇到错误时,理解LaTeX的错误消息至关重要,它们能帮助定位问题...

    ser2net 2.10.0交叉编译OK

    5. **安装**:编译完成后,使用`make install`将编译好的二进制文件安装到指定目录,通常为`/usr/local/bin`。 6. **验证**:在目标平台上运行编译好的ser2net,确保其能正常工作。 二、ser2net 2.10.0 主要功能与...

    Python库 | acl_iitbbs-0.1-py3-none-any.whl

    `acl`可能指的是“访问控制列表”(Access Control List),这通常与权限管理有关,暗示该库可能包含用于管理用户权限或论坛访问规则的函数和类。 Python库的设计通常遵循模块化原则,因此`acl_iitbbs`可能包含多个...

    SSH实现OA系统,基于ACL权限管理

    SSH(Spring、Struts、...综上所述,这个SSH实现的OA系统利用了Java的技术栈来构建一套安全、可扩展的办公自动化平台,通过ACL权限管理确保了不同用户只能访问他们被授权的功能,从而提高了系统的安全性与效率。

    cygwin 交叉编译的 coturn 服务器可以在windows 下运行

    4. **编译与安装** 执行`make`进行编译,完成后再执行`make install`进行安装。这些命令会创建可执行文件和其他必要文件,并将其安装到指定的路径。 5. **运行脚本** 压缩包中的"server"文件可能是coturn服务器的...

    ACL技术文档续

    - **特点**: TurboACL能够在处理第一条匹配规则的同时将整个ACL编译成一组查询表。这意味着只需要检查数据包头部就能快速匹配到相应的规则,从而大大提高了效率。 - **支持平台**: Cisco 7200、7500及12000系列GSR...

Global site tag (gtag.js) - Google Analytics