在安装 openssl 到unbuntu的时候遇到问题。将前因后果和自己的分析记录一下。
前提:安装openssl到unbuntu,使用源码方式完成。
下载安装包 https://www.openssl.org/source/
将安装包放在unbuntu的目录下,习惯将用的开发相关工具放在Desktop/tool下
新建文件夹: /home/hunandede/Desktop/tool/openssl
通过fileZilla 工具将 openssl-1.1.1c.tar.gzip放在 /home/hunandede/Desktop/tool/openssl下
c. 进入到openssl目录
d.源码安装包解压缩
tar zxvf openssl-1.1.1c.tar.gzip
# 加压完成得到目录: openssl-1.1.1c
e. 运行openssl-1.1.1c下的 ./configure
configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生相应的makefile文件,Makefile 规定了用什么编译器、编译参数等信息。从而可以使你的源代码能在不同的操作系统平台上被编译出来。比如它会检测你是不是有CC或GCC。
可以通过在 configure 后加上参数来对安装进行控制,比如代码:
./configure --prefix=/usr
可以简单的认为运行configure的目的是为了生成makfile文件
#如果正常完成,则会生成makefile文件
f. 使用sudo make install (使用管理员权限执行该命令)
g. 完成后,使用 openssl version -a 查看是否安装成功
结果有问题,提示:
openssl: symbol lookup error: openssl: undefined symbol: EVP_mdc2, version OPENSSL_1_1_0
分析原因:
有的程序执行需要链接动态库,但是自己安装的openssl的动态库并不在/usr/lib下。
可以认为是找不到动态库问题导致的。
解决找不到动态库.so的问题---有两种方法
使用环境变量LD_LIBRARY_PATH,
将动态库的绝对路径添加到该环境变量中
LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)
export LD_LIBRARY_PATH
注意该方法:此时文件生效只是在当前端口,关闭端口后就不起作用了
永久改变,写入配置文件中
~/.bashrc ----用户级别
/etc/profile ---系统级别的
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。当执行函数动态链接.so时,如果此文件不在缺省目录下‘/lib’ and ‘/usr/lib’.
那么就需要指定环境变量LD_LIBRARY_PATH
假如需要在已有的环境变量上添加新的路径名,则采用如下方式:在打开任意终端,输入
LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)
然后 export LD_LIBRARY_PATH
例如:
LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH
export LD_LIBRARY_PATH
注意,此时文件生效只是在当前端口,关闭端口后就不起作用了
将动态库的绝对路径加到/etc/ld.so.conf 文件中 或者 /etc/ld.so.conf.d/libc.conf 中。
sudo echo "/home/hunandede/Desktop/tool/openssl/openssl-1.1.1c" >> /etc/ld.so.conf.d/libc.conf && ldconfig
将动态库加入到LD_LIBRARY_PATH中,这和windows中的环境变量是一样的,那么加入到这个/etc/ld.so.conf 里面是什么原因呢?
baidu了一下。
转摘至:https://blog.csdn.net/Robert_Q/article/details/124395260
1.Linux 系统上有两类根本不同的 Linux 可执行程序。
第一类是静态链接的可执行程序。它们是“完整的”,静态可执行程序不依赖任何外部库就可以运行。
第二类则是动态链接的可执行程序,他们在执行时还需要动态地调用其他库,对其他库存在依赖,这样做的好处就是减小了自己程序的大小。而我们要关注的ld.so.conf 文件就是一个包含要搜索的动态链接库目录的清单
2.动态链接库的搜索
2.1 查询程序依赖的动态链接库
以ln命令为例,我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的,查看 ln 依赖的所有共享库的列表:
ldd /bin/ln
如上图所示,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。
通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。
例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常我们会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。
2.2 动态装入器(dynamic loader)
那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?
答案是动态装入器(dynamic loader),它实际上是在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。
动态装入器负责装入动态链接的可执行程序运行所需的共享库。
现在,让我们看一下动态装入器如何在系统上找到适当的共享库。
动态装入器找到共享库要依靠两个文件:/etc/ld.so.conf 和/etc/ld.so.cache
2.3 /etc/ ld.so.conf文件
我们可以在ld.so.conf 文件中指定很多目录(/lib 和 /usr/lib 除外,它们会自动包含在其中),动态装入器将在其中查找共享库。
在默认的/etc/ld.so.conf文件中,可以看到有如下内容:
include /etc/ld.so.conf.d/*.conf
说明/etc/ld.so.conf.d/目录下所有的.conf文件都被包含,文件中所有的路径都会被搜索到。
2.4 ldconfig命令
但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过在shell里执行 ldconfig 命令做到这一点:
ldconfig
当 ldconfig 操作结束时,就会生成一个最新的 /etc/ld.so.cache 文件,它反映了我们对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看我们在 /etc/ld.so.conf 中指定的所有新目录。
ldconfig命令参数:
-v或–verbose:ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字
-f CONF:此选项指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf
-p或–print-cache:此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字。
-V:此选项打印出ldconfig的版本信息,而后退出。
2.5 /etc/ld.so.conf.d目录
另外,我们还可以在/etc/ld.so.conf.d/目录下创建.conf文件来添加库路径。