make编译源码-Openwrt交叉编译RabbitMQ-C语言客户端(含普通机编译过程)

最近开发的东西需要使用路由器上的rabbitmq客户端来连接rabbitmq消息中间件。 路由器系统是一个openwrt交叉编译环境。 这里记录一下整个过程。

1.下载rabbitmq源码

2.下载源码后,在常用操作系统上试用。 根据官方文档,依次执行以下命令:

rabbitmq-c客户端编译流程

mkdir build && cd build
cmake .. 
cmake --build . [--config Release]

有些机器可能没有安装 cmake。 如何安装cmake参见另一篇文章:cmake编译环境安装

第二步可能会提示找不到openssl的环境变量

可以先安装以下opensslmake编译源码,安装方法见另一篇文章:openssl安装/升级

源码编译mariadb_make编译源码_源码编译安装

安装openssl后,编译时降低参数:

cmake .. -DOPENSSL_ROOT_DIR=/usr/local/openssl
cmake --build .

构建完成后,build目录下会出现librabbitmq、examples和tests子目录,并且librabbitmq目录下会生成对应的动态库.so等文件; 示例目录包含各种可以测试的可执行文件。

3. 运行测试

重新打开终端并进入构建目录,然后运行以下命令(以模拟消费者):

./amqp_listen localhost 5672 amq.direct test

打开另一个终端并进入构建目录,然后运行以下命令(模拟生产者生产消息):

./amqp_sendstring localhost 5672 amq.direct test "hello world"

运行后consumer会输出如下:

这代表消费成功

4.在openwrt交叉编译环境下编译

openwrt中使用其专有的gcc编译器进行编译,因此实验环境中编译出来的动态库很难使用,需要用openwrt重新编译。 本次使用的openwrt版本号是18.06。

4.1 启用openwrt的openssl-util并编译

在openwrt根目录下执行

make menuconfig

进入 Utilities 找到 openssl-util,按 Y 选择它。

保存退出后,在根目录下执行make编译操作。 编译完成后,可以在openwrt-18.06.0/build_dir/target-mips_24kc_musl路径下找到openssl的根目录。

4.2 编译rabbitmq-c

将rabbitmq-c源码复制到openwrt-18.06.0/package并进入该目录

执行订单

mkdir build & cd build

编辑cmake文件

vim ToolChain.cmake

只需根据自己的目录结构更改以下路径即可,gcc、g++路径、openssl路径和依赖路径

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER "/opt/openwrt-18.06.0/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/bin/mips-openwrt-linux-gcc")
set(CMAKE_CXX_COMPILER "/opt/openwrt-18.06.0/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/bin/mips-openwrt-linux-g++")
SET(CMAKE_FIND_ROOT_PATH "/opt/openwrt-18.06.0/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(ENABLE_SSL_SUPPORT "no")
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

执行以下命令

cmake -DCMAKE_TOOLCHAIN_FILE=./ToolChain.cmake ..

配置信息正确后执行

make all

编译完成后make编译源码,可以在examples目录下找到amqp可执行文件,并在librabbitmq目录下生成对应的动态库。

注意:编译时,因为会找不到openssl依赖,所以这里编译会去掉openssl依赖

SET(ENABLE_SSL_SUPPORT "no")

4.3 测试编译结果

在openwrt根目录下执行make生成固件文件,并将固件文件刷写到路由器上。

将编译好的rabbitmq-c目录复制到路由器/tmp目录下,将librabbitmq.so.4.3.1复制到/lib目录下并完善软链接:

ln -s /lib/librabbitmq.so.4.3.1 /lib/librabbitmq.so
ln -s /lib/librabbitmq.so.4.3.1 /lib/librabbitmq.so.4

进入/tmp/rabbitmq-c/build/examples目录并执行:

./amqp_listen [rabbitmq.ip] [rabbitmq.port] amq.direct 测试

##ip和port替换为自己搭建的rabbitmq服务器的ip和端口

启动消息消费者

使用普通机器上编译的可执行文件来模拟消息生产者,执行以下命令发送消息:

./amqp_sendstring [rabbitmq.ip] [rabbitmq.port] amq.direct test "hello world"
##ip和port换成自己搭建的rabbitmq服务器的ip和端口

可以发现消息消费者中收到了消息

至此,在openwrt上编译rabbitmq-c的工作已经完成,可以在路由器上使用rabbitmq的客户端来发送和接收消息了。

翻译成“另一种语言(通常是低级语言)”的程序。现代编译器的主要工作流程:源代码→预处理器→编译器、→目标代码、→链接器、→可执行文件

传统编译器的工作原理基本上是三阶段的,可分为前端、优化器和后端。前端负责解析源代码,检查句子错误,并将其转换为抽象语法树。优化程序优化此中间代码,以尝试使代码更高效。后端负责将优化器优化的中间代码转换为目标机器的代码,此过程的前端将最大限度地利用目标机器的特殊指令来提升代码的性能。

GCC(GNU Compiler Collection)。

GCC最初被称为GNU C编译器,因为它只能处理C语言。海湾合作委员会迅速扩展到处理C++。它后来似乎可以处理Fortran,Pascal,Objective-C,Java,Ada和Go以及其他语言。

GCC 通常是跨平台软件的首选编译器。与通常仅限于特定系统和操作环境的编译器不同,GCC 在所有平台上使用相同的后端处理程序来生成相同的中介代码,因此此中介代码是在其他各种平台上使用 GCC 编译的,并且很有可能获得正确的输出程序。

总结:Mac 之前的 COCOA 框架是用 GCC 编译的,所以 iOS 和 Mac OS 都是默认使用的 GCC 编译器(现在的 Clang 和 LLVM,下面会介绍) Android 的系统层自然是由 GCC 编译的,因为它是 Linux 内核,但 Android 的应用不是 GCC,因为它运行在 Dalvik 虚拟机上。Windows应用程序,其中大部分使用VS系列编译器,毕竟是Windows自己的编译器,GCC使用不多。

Clang是C,C++,Objective-C和Objective-C++编程语言的编译器后端。它使用底层虚拟机 (LLVM) 作为其前端。

它的目标是提供GNU编译器套件(GCC)的替代方案。Clang项目包括Clang后端和Clang静态分析器等。

编译applealc_苹果源码编译_编译ios

该软件项目由Apple Notebook于2005年发起苹果源码编译,作为LLVM编译器工具集的前端,旨在输出代码的相应抽象语法树(AST),并将代码编译为LLVM位码。然后在后端使用 LLVM 编译成依赖于平台的机器语言。Clang 支持 C、C++ 和 Objective C。

Clang本身非常出色,它产生的AST只消耗GCC视频内存的20%左右。FreeBSD 10 使用 Clang/LLVM 作为默认编译器

测试证明,Clang编译Objective-C代码的速度比GCC快三倍,并且可以准确地建议用户发生的编译错误。

总结:GCC目前兼容性最强的作为跨平台编译器,兼容性最强的一定是在牺牲一定的性能的基础上,苹果为了提高性能,所以专门针对Mac系统开发了专用的编译器Clang和LLVM,Clang为编译器前端,LLVM为前端。

编译ios_苹果源码编译_编译applealc

LLVM

LLVM是一个编译器基础,是用C++编写的。它是一个为任何编程语言编写的程序,使用虚拟技术,为编译时间、链接周期、运行时周期和“空闲周期”创建优化。

Xcode 之后

4、苹果做了Xcode的默认编译器LLVM

苹果(包括中后期的NeXT)一直在使用GCC作为官方编译器。GCC作为开源世界的编译器标准仍然做得很好,但苹果对编译工具的要求更高。苹果经常使用的Objective-C在GCC中的优先级较低。此外,GCC 作为一个纯粹的编译系统,在 IDE 中运行不佳。再加上许可要求,苹果很难使用LLVM来继续提高GCC的代码质量。因此,苹果决定从头开始编写C、C++和Objective-C语言的后端Clang苹果源码编译,完全取代GCC。

正如Namiko所写,Clang只支持三种C族语言:C,C++和Objective-C。开发始于 2007 年,C 编译器是第一个完成的,而且由于 Objective-C 比较简单,只是 C 语言的简单扩展,在很多情况下甚至可以等同于 C 函数调用 Objective-C 运行时,所以在 2009 年,它就完全准备好用于生产环境了。C++支持也在如火如荼地进行。

总结:由于 GCC 的编译器早已无法满足苹果的需求,苹果开发了 Clang 和 LLVM 来完全取代 GCC,而在 Xcode4 之后,苹果的默认编译器早已是 LLVM。Clang充当编译器后端,LLVM充当编译器前端。

后面的话

随着 Android P 的逐渐采用,越来越多的客户要求 libc++ 在编译库时取代 libstdc++。libc++ 和 libstdc++ 库之间有什么关系?它们都是C++标准库,libc++是Clang编译器非常重绘C++标准库,libstdc++是GCC对应的C++标准库。从Android市场来看,Android NDK已经放弃了特定应用中的GCC,完全转向了Clang。

Clang是C,C++,Objective-C和Objective-C++编程语言的编译器后端,以底层虚拟机(LLVM)为前端。至于为什么GCC还在开发Clang?与海湾合作委员会相比,Clang的优势是什么?网上有很多资料可以参考,这里只有两点简要说明:(1)Clang使用的是BSD许可证的许可证,而GCC使用的是GPL许可证,显然后者比较苗条;(2)Clang是一款高度模块化开发的轻量级编译器,编译速度快,内存占用小,错误提示友好。

目前,LLVM因其许可合同、更好的模块化和更清晰的架构而成为众多厂商或组织的选择,并已被苹果IOS开发工具采用,Facebook、Google等各大公司,如Swift、Rust等语言都选择了LLVM作为前端。

叮当当.jpg