Linux调试智能卡环境搭建(二),其中包含Linux编译链接动态库相关

70 篇文章 1 订阅

以下所需要的部分离线资源已上传CSDN资源pcsc、ccid、libusb

一、下载离线安装包(注意安装过后的就无法只下载了)

CentOS利用yum下载好rpm包,并离线安装

1、联网安装好rpm包,并将下载好的包备好

#yum install --downloadonly --downloaddir=/home/samba  samba

其中samba 是要用yum安装的安装包,/home/samba是要存放下载的yum安装包及其依赖包的保存路径

2、离线的机器上,在rpm所在的文件夹内,执行以下脚本

#rpm -Uvh --force --nodeps *.rpm  (最好使用强制安装,否则可能安装不上)

-ivh:安装显示安装进度--install--verbose--hash
-Uvh:升级软件包--Update;

使用方式:rpm -ivh [软件包]。
ivh意思是软件包管理器的选项,其中i表示安装,v表示显示安装过程,h表示显示进度。

3、CentOS卸载软件

# 查询软件列表
# rpm -qa | grep 软件名
rpm -qa | grep mysql
 
# 卸载软件
# sudo yum remove 软件名
sudo yum remove mysql

ubuntu只下载不安装deb包:

sudo apt-get install -d 包名

这样就只下载不安装,下载的文件在目录

ls   /var/cache/apt/archives

将软件包拷贝到你所需要的地方,在该目录执行

dpkg -i  包名
或者 dpkg --force-all -i *.deb (强制安装)

ubuntu 删除软件包

apt-get purge / apt-get --purge remove 

删除已安装包(不保留配置文件)。
如软件包a,依赖软件包b,则执行该命令会删除a,而且不保留配置文件
apt-get autoremove 

删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包),保留配置文件。
apt-get remove 

删除已安装的软件包(保留配置文件),不会删除依赖软件包,且保留配置文件。

note:
如果出现安装卸载失败,需要修复安装

sudo apt-get -f install 
二、常用指令:
yum install opensc
opensc-tool --list-readers(重启才生效)

枚举当前PC中的读卡器    opensc-tool --list-readers   (前提已经安装openSC工具) 

枚举PC中的USB设备       sudo lsusb 

启动pcsc服务            /usr/local/sbin/pcscd -adf   (前提已经安装pcsc-lite)
						显示出如下类似信息则为安装成功
						00017575 pcscdaemon.c:518:main() pcsc-lite 1.8.1 daemon ready.
						
重启PCSC服务            sudo service pcscd restart


更换gcc版本             update-alternatives --config gcc
三、CentOS环境安装:

Linux环境:CentOS7
GCC:gcc-4.8.5 g++ -4.8.5

安装gcc 和g++

前提连接互联网

可以先更新一下源:yum update 
安装gcc:yum install gcc
安装g++: yum install gcc-c++

centOS7默认GCC版本为4.8.5

( Login as a root to install driver )登录root用户安装驱动

1、联网安装libudev

on ubuntu

apt-get install libudev-dev

----------------------

on centos

yum install systemd-devel

2、常规安装 libusb-1.0.21.tar.bz2 、pcsc-lite_1.8.23.orig.tar.bz2、ccid_1.4.36.orig.tar.bz2

安装CCID时,需要指定libusb和PCSC的路径:
根据libusb不同版本来选择:

./configure PCSC_CFLAGS="-I/usr/local/include/PCSC" LIBUSB_CFLAGS="-I/usr/local/include/libusb-1.0" LIBUSB_LIBS="-L/usr/local/lib -lusb-1.0" --enable-usbdropdir="/usr/local/lib/pcsc/drivers"   PCSC_LIBS="-L/usr/local/lib -lpcsclite"

./configure PCSC_CFLAGS="-I/usr/local/include/PCSC" LIBUSB_CFLAGS="-I/usr/local/include/libusb" LIBUSB_LIBS="-L/usr/local/lib -lusb" --enable-usbdropdir="/usr/local/lib/pcsc/drivers"   PCSC_LIBS="-L/usr/local/lib -lpcsclite"

3、安装perl解释器插件(可能有的系统缺少这个解释器,ubuntu16.04不缺少,但是CentOS7缺少)

yum install perl-devel

4、启动pcsc服务 /usr/local/sbin/pcscd -adf 显示ACR38信息即表示成功

如果识别不到可以插拔一下读卡器

note:
CentOS可能没有lsusb命令,需要安装

yum -y install usbutils 
相关命令介绍:
lsusb: 显示USB设备的详细信息

lspci:  显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息

一键安装:
yum -y install usbutils pciutils
四、ubuntu安装一般步骤:

Ubuntu编译环境:

Linux 系统:ubuntu16.04
gcc版本: gcc-4.7.4 g++ -4.7.4

如果使用支持PCSC的读卡器,需要安装libusb ccid pcsc-lite 驱动

1、安装libusb

 # tar zxvf  libusb-0.1.12.tar.gz 
 # cd libusb-0.1.12  
 # chmod +x configure                        
 # ./configure                             
 # make                                    
 # make install          ( Login as a root to install driver )     
可能出现以下错误及解决办法:
configure: error: compiler with C11 support is required to build libusb

更换gcc 5.4,更换高版本gcc,或者下载使用libusb-1.0.21.tar.bz2,支持C99

configure: error: udev support requested but libudev header not installed

看CSDN博客:
https://blog.csdn.net/liuyan20092009/article/details/52577262

2、安装pcsc-lite

 # tar zxvf  pcsc-lite-1.9.1.tar.gz 
 # cd pcsc-lite-1.9.1.tar.gz 
 # chmod +x configure 
 # ./configure                             
 # make                                    
 # make install          (Login as a root to install driver) 
错误及解决办法:
configure: error: install libsystemd-dev or use --disable-libsystemd

apt-get install libsystemd-dev

3、安装ccid

 # tar zxvf  ccid_1.4.36.orig.tar.gz 
 # cd ccid-1.4.36  
 # ./configure                             
 # make                                    
 # make install          (Login as a root to install driver) 

4、
最后启动pcsc服务

 /usr/local/sbin/pcscd 
 或者 /usr/local/sbin/pcscd -adf

Linux动态库相关:

一、 Linux 动态库选择顺序指:
  1. 编译程序时用到动态库,该从那些地方查找,按照怎么样的顺序查找?

  2. 运行程序时需要动态库,该从那些地方查找,按照怎么样的顺序查找?

二、gcc 编译程序时查找SO顺序如下:
  1. gcc 编译时参数-L指定的路径

  2. 环境变量 LIBRARY_PATH

  3. 系统默认库位置 /lib /usr/lib

三、Linux 程序运行时查找SO顺序如下:
  1. gcc 编译时指定的运行时库路径 -Wl,-rpath

  2. 环境变量 LD_LIBRARY_PATH

  3. ldconfig 缓存 /etc/ld.so.cache

  4. 系统默认库位置 /lib /usr/lib

四、LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:

LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH

LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH

举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。

区别与使用:

开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。

发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。

五、(很重要) -Wl,-rpath=

在编译时添加运行时的库路径

-Wl,-rpath=/usr/local/lib  

是为程序添加一个运行时库文件搜索路径的命令,在使用gcc编译链接时添加即可。

其中,有两个单独的部分-Wl和-rpath组成。

-Wl
  这个是gcc的参数,表示编译器将后面的参数传递给链接器ld。

请注意此处的W是大写的。

-rpath

1. 添加一个文件夹作为运行时库的搜索路径。在将ELF可执行文件与共享对象链接时使用此选项;
2. 在链接时,一些动态库明确的链接了其他动态库, 则-rpath选项也可用于定位这些链接的动态库(没太理解这个);
3. 在运行链接时,会优先搜索-rpath的路径,再去搜索LD_RUN_PATH的路径。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值