CentOS7.6 源碼安裝 zeromq-4.2.5


獲取ZeroMQ

ZeroMQ官網:https://zeromq.org/

下載ZeroMQ源碼包鏈接1:https://github.com/zeromq/libzmq/releases

下載ZeroMQ源碼包鏈接2:https://zeromq.org/download/

ZeroMQ歷史版本下載鏈接:http://download.zeromq.org/

《說明》ZeroMQ支持多種編程語言,包括C、C++、Java、C#、Python、Go、Ruby、NodeJS等主流編程語言。你可以進入鏈接2下載對應編程語言的ZMQ版本。

本人下載的是ZeroMQ的C語言版本libzmq,包文件名為:zeromq-4.2.5.tar.gz。

《注意》安裝需要有root權限,最好是在root用戶下進行,如果不是root用戶,執行編譯安裝操作時需要在命令前加上 sudo 。本人是在root用戶下進行操作的。

安裝步驟

一、解壓縮 zeromq-4.2.5.tar.gz 文件。

tar -xzvf zeromq-4.2.5.tar.gz

解壓縮成功后,進入zeromq-4.2.5目錄,執行version.sh腳本,會打印出當前zeromq的版本信息。

[root@centos7 zeromq-4.2.5]# ./version.sh
4.2.5[root@centos7 zeromq-4.2.5]#

二、配置 zeromq 的安裝環境

1、這個是執行 configure 腳本文件,可以執行 ./configure --help 來查看配置選項和安裝路徑。如果不加任何選項的話,默認是安裝在 /usr/local 路徑下,使用 make install 命令安裝后,所有文件都是在 `/usr/local/bin', `/usr/local/lib' etc。我們這里自定義一下zeromq的安裝路徑。

./configure --prefix=/usr/local/zeromq

報錯:configure: error: Unable to find a working C++ compiler。提示沒有C++編譯器,所以首先需要安裝g++編譯器。

** 在CentOS上使用yum安裝C++開發環境:
安裝gcc的命令:sudo yum install gcc
安裝g++的命令:sudo yum install gcc-c++

安裝成功后,執行 g++ -v 命令,正確打印出 g++編譯器的版本信息表示安裝成功了。

2、配置腳本執行成功后,使用make命令進行編譯。

make

3、編譯通過后,使用 make install 命令開始安裝。

make install

執行成功后,進入/usr/local,查看zeromq目錄的樹形結構:

[root@centos7 local]# tree -L 3 zeromq/ zeromq/ ├── bin │   └── curve_keygen ├── include │   ├── zmq.h │   └── zmq_utils.h ├── lib │   ├── libzmq.a │   ├── libzmq.la │   ├── libzmq.so -> libzmq.so.5.1.5 │   ├── libzmq.so.5 -> libzmq.so.5.1.5 │   ├── libzmq.so.5.1.5 │   └── pkgconfig │   └── libzmq.pc └── share └── man ├── man3 └── man7

可以看到,zeromq目錄下的一級子目錄有4個目錄文件:bin/、include/、lib/、share,下面分別作簡要說明:

bin/:存放的可執行文件。

include/:存放的是頭文件。

lib/:存放的是一些庫文件。

.a文件:為靜態庫,是好多個.o文件合在一起,用於靜態連接。.la文件:為libtool工具自動生成的一些共享庫,主要記錄了一些配置信息,是一個文本文件,可以用vi/vim命令打開查看其內容。可以用如下命令查看*.la文件的格式:

# file *.la
libzmq.la: libtool library file, ASCII text

libzmq.so.5.1.5:為共享庫文件,是shared object,用於動態連接的,類似於Windows系統中的.dll庫文件。

libzmq.so、libzmq.so.5:都為軟鏈接文件(又稱為符號鏈接),它們鏈接的源文件是libzmq.so.5.1.5。

[root@centos7 lib]# ll *.so*
lrwxrwxrwx 1 root root 15 Jun 2 11:25 libzmq.so -> libzmq.so.5.1.5
lrwxrwxrwx 1 root root 15 Jun 2 11:25 libzmq.so.5 -> libzmq.so.5.1.5
-rwxr-xr-x 1 root root 9224352 Jun 2 11:25 libzmq.so.5.1.5

share/:share目錄下存放的是man,它存放的是幫助手冊文件,有man3、man7,可以使用man命令來查看。man3是庫調用函數,man7是宏命令包和約定。

由於zeromq是我們自定義的安裝路徑,而man命令的默認搜索路徑是:/usr/local/share/man:/usr/share/man。可以使用 man -w 查看man查找手冊的路徑。我們可以修改man命令搜索配置文件man_db.conf來添加zeromq的幫助手冊搜索路徑。vim /etc/man_db.conf,由於我這里只是添加zeromq的API函數的搜索路徑,找到MANDATORY_MANPATH的位置,在下面添加如下內容:

MANDATORY_MANPATH                /usr/local/zeromq/share/man

然后,保存退出。於是,我們就可以使用man命令來查看zeromq的API函數的用法信息了,如:man zmq_socket,下面是部分內容的打印信息。

# man zmq_socket
ZMQ_SOCKET(3)                                                          0MQ Manual                                                         ZMQ_SOCKET(3)

NAME
       zmq_socket - create 0MQ socket

SYNOPSIS
       void *zmq_socket (void *context, int type);

DESCRIPTION
       The zmq_socket() function shall create a 0MQ socket within the specified context and return an opaque handle to the newly created socket. The
       type argument specifies the socket type, which determines the semantics of communication over the socket.

也可以使用命令:man 3 zmq_socket,3表示man只會在man3目錄下去查找對應的函數名。

<備注> 如果要使用man 命令查找bin/目錄下的Linux命令的用法的話,同樣可以在man_db.conf文件中配置MANPATH_MAP關鍵字的路徑。

【參考】

linux下configure命令詳細介紹:https://www.cnblogs.com/xuezhileikaku/articles/5343107.html

Linux man命令詳細介紹:https://www.cnblogs.com/DataArt/p/10010673.html

4、設置共享庫的搜索路徑

  我們知道,要使用zeromq三方庫,在編譯的時候需要添加 -lzmq 選項,在編譯的鏈接階段會連接靜態庫,在運行的時候會加載zeromq的共享庫,這就需要知道這些庫文件所在的路徑。

  一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為默認的庫搜索路徑,所以使用這兩個目錄中的庫時不需要進行設置搜索路徑即可直接使用。對於在默認庫搜索路徑之外的庫,需要將庫的位置添加到庫的搜索路徑之中。設置庫文件的搜索路徑有下列兩種方式,可任選其一使用:

(1)在 /etc/ld.so.conf 文件中添加庫的搜索路徑。或者在 /etc/ld.so.conf.d 目錄下添加 *.conf文件,添加的內容是庫文件的絕對路徑。這種方式是全局設置,對所有用戶有效,因此不建議使用這種方式設置三方庫的搜索路徑。推薦使用第二種方式。

(2)在環境變量 LD_LIBRARY_PATH 中指明庫的搜索路徑。一般的用法是在當前用戶的主目錄(cd ~)下,在 .bash_profile配置文件中設置該環境變量。添加內容如下:

# Add third_lib path
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/zeromq/lib

修改保存后,執行如下操作:

$ source ~/.bash_profile        #讓修改生效
$ echo $LD_LIBRARY_PATH         #打印出環境變量的值
/usr/local/lib:/usr/local/lib64::/usr/local/zeromq/lib

** 實例:編譯一個zmq_version.c源文件,源碼如下:

#include <zmq.h>
#include <stdio.h>
int main()
{
  int major,minor,patch;
  zmq_version(&major,&minor,&patch);	//返回ZMQ鏈接庫的版本
  printf("Current ZMQ version is %d.%d.%d\n",major,minor,patch); //輸出版本號
  return 0;
}

編譯命令:

$ gcc zmq_version.c -o zmq_version -lzmq
zmq_version.c:1:17: fatal error: zmq.h: No such file or directory
#include <zmq.h>
^
compilation terminated.

可以看到,編譯報錯了,找不到頭文件,所以,我們還需要設置zmq的頭文件搜索路徑,我們可以通過設置C頭文件環境變量C_INCLUDE_PATH 的值,對應的C++頭文件環境變量是CPLUS_INCLUDE_PATH

5、設置頭文件的搜索路徑

同樣是在當前用戶主目錄下的 .bash_profile文件下設置。

$ vim ~/.bash_profile,添加如下內容:

#Add C header file path
export C_INCLUDE_PATH=/usr/local/zeromq/include:$C_INCLUDE_PATH

$ source ~/.bash_profile

$ echo $C_INCLUDE_PATH
/usr/local/zeromq/include:

然后,繼續編譯。

$ gcc zmq_version.c -o zmq_version -lzmq
/usr/bin/ld: cannot find -lzmq
collect2: error: ld returned 1 exit status

還是報錯了,找不到-lzmq的共享庫。但是如果編譯時通過-L參數加上鏈接庫的搜索路徑卻可以編譯通過:gcc zmq_version.c -o zmq_version -L/usr/local/zeromq/lib -lzmq

查看一下生成的可執行文件zmq_version所依賴的共享庫列表:

$ ldd zmq_version
linux-vdso.so.1 => (0x00007fff26546000)
libzmq.so.5 => /usr/local/zeromq/lib/libzmq.so.5 (0x00007f02e4476000)
libc.so.6 => /lib64/libc.so.6 (0x00007f02e40a9000)
librt.so.1 => /lib64/librt.so.1 (0x00007f02e3ea1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f02e3c85000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f02e3a81000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f02e377a000)
libm.so.6 => /lib64/libm.so.6 (0x00007f02e3478000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f02e3262000)
/lib64/ld-linux-x86-64.so.2 (0x00007f02e4704000)

可以看到,其所依賴的zeromq的共享庫文件是 /usr/local/zeromq/lib/libzmq.so.5。讓我疑惑的是,我已經設置了環境變量LD_LIBRARY_PATH的值,添加了zeromq的共享庫路徑了,並且修改生效了,編譯時還是提示無法找到zmq的依賴庫文件。去網上尋找了下解決辦法,發現博客都是千篇一律地認為是沒有安裝第三方庫所導致的,但是我的庫已經安裝成功了,國內的技術博客質量有時真是讓人無語啊,汗顏!!!

經過多次的嘗試,只能說提供了一個不算完美的解決方案,方法如下:

]# cd /usr/local/lib
]# ln -s /usr/local/zeromq/lib/libzmq.so.5.1.5 /usr/local/lib/libzmq.so

通過在系統默認搜索共享庫路徑下創建軟連接,然后使用編譯命令:gcc zmq_version.c -o zmq_version -lzmq 編譯通過了。但總覺得這是多此一舉,因為在/usr/local/zeromq/lib路徑下是有軟連接文件的,上面的介紹中我也提到過的。

這個問題總算是找到原因了,除了要設置LD_LIBRARY_PATH環境變量,還需要設置LIBRARY_PATH環境變量。在 ~/.bash_profile文件中添加如下內容:

export LIBRARY_PATH=/usr/local/zeromq/lib:$LIBRARY_PATH

然后使用gcc zmq_version.c -o zmq_version -lzmq 命令編譯就可以通過了。這兩個環境變量還是有所區別的。

【參考】

1、 環境變量:LIBRARY_PATH 和 LD_LIBRARY_PATH的區別

6、使用 pkgconfig 方式來自動配置頭文件和文件的搜索路徑

在ZeroMQ的安裝路徑下的/usr/local/zeromq/lib下有一個pkgconfig目錄,有一個libzmq.pc文件,內容如下:

# more libzmq.pc
prefix=/usr/local/zeromq
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libzmq
Description: 0MQ c++ library
Version: 4.2.5
Libs: -L${libdir} -lzmq
Libs.private: -lstdc++
Cflags: -I${includedir}

這個libzmq.pc文件描述了ZMQ庫的安裝路徑、庫文件路徑、頭文件路徑等相關信息。

pkg-config功能簡介

  一般來說,如果庫的頭文件不在/usr/include目錄中,那么在編譯的時候需要用-I參數指定其路徑。由於同一個庫在不同系統上可能位於不同的目錄下,用戶安裝庫的時候也可以將庫安裝在不同的目錄下,所以即使使用同一個庫,由於庫的路徑的不同,造成了用-I參數指定的頭文件的路徑和在連接時使用-L參數指定lib庫的路徑都可能不同,其結果就是造成了編譯命令界面的不統一。可能由於編譯,連接的不一致,造成同一份程序從一台機器copy到另一台機器時就可能會出現問題。

  pkg-config 就是用來解決編譯連接界面不統一問題的一個工具。

它的基本思想:pkg-config是通過庫提供的一個.pc文件獲得庫的各種必要信息的,包括版本信息、編譯和連接需要的參數等。需要的時候可以通過pkg-config提供的參數(–cflags, –libs),將所需信息提取出來供編譯和連接使用。這樣,不管庫文件安裝在哪,通過庫對應的.pc文件就可以准確定位,可以使用相同的編譯和連接命令,使得編譯和連接界面統一。

  它提供的主要功能有:

  <1> 檢查庫的版本號。如果所需庫的版本不滿足要求,打印出錯誤信息,避免連接錯誤版本的庫文件。
  <2> 獲得編譯預處理參數,如宏定義,頭文件的路徑。
  <3> 獲得編譯參數,如庫及其依賴的其他庫的位置,文件名及其他一些連接參數。
  <4> 自動加入所依賴的其他庫的設置。

使用pkg-config工具提取庫的編譯和連接參數有兩個基本的前提:

  <1> 庫本身在安裝的時候必須提供一個相應的.pc文件。不這樣做的庫說明不支持pkg-config工具的使用。
  <2> pkg-config必須知道要到哪里去尋找此.pc 文件。

環境變量PKG_CONFIG_PATH

  環境變量PKG_CONFIG_PATH是用來設置xxx.pc文件的搜索路徑的,pkg-config按照設置路徑的先后順序進行搜索,直到找到指定的.pc 文件為止。這樣,庫的頭文件的搜索路徑的設置實際上就變成了對xxx.pc文件搜索路徑的設置。設置環境變量PKG_CONFIG_PATH的步驟如下:

1、vim .bash_profile,添加如下內容:

#Add pkg-config path
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

source ~/.bash_profile  //使修改生效

$ echo $PKG_CONFIG_PATH
/usr/local/lib/pkgconfig:

2、將zeromq安裝路徑下的libzmq.pc文件復制到指定的目錄下

cp /usr/local/zeromq/lib/pkgconfig/libzmq.pc /usr/local/lib/pkgconfig

3、編譯源文件命令

]$ gcc `pkg-config --cflags --libs libzmq` zmq_version.c -o zmq_version

--cflags參數:可以給出在編譯時所需要的頭文件路徑。

--libs參數:可以給出在編譯時所需要的共享庫文件路徑。

libzmq:這個是庫名稱,對應libzmq.pc文件。因此,如果有多個.pc文件的情況下,pkg-config可以正確地找到所需要的.pc文件了。

如果安裝的三方庫自動提供了.pc文件,建議在編寫Makefile文件的時候,使用這種方式來配置程序編譯時所依賴的頭文件和庫文件,這樣就能保證連接的頭文件和庫文件是統一的版本。

【參考】

1、簡述configure、pkg-config、pkg_config_path三者的關系

2、pkg-config原理及用法

總結

  至此,zeromq-4.2.5三方庫的源碼安裝和環境配置已經弄好了,可以使用zeromq庫進行應用程序的開發工作了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM