关于pkg-config与LD_LIBRARY_PATH与/etc/ld.so.conf文件的区别与作用

本文详细介绍了Linux系统中动态库的使用,包括静态链接与动态链接的可执行程序。重点讨论了pkg-config的查找路径,以及动态库设置问题的解决方案,如通过PKG_CONFIG_PATH和LD_LIBRARY_PATH环境变量。同时,解释了/etc/ld.so.conf文件在程序运行时查找libxxx.so动态库的作用。最后,探讨了动态装入器如何找到共享库,并提到了ldconfig和LD_LIBRARY_PATH的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 共享库

  Linux 系统上有两类根本不同的 Linux 可执行程序。

1. 第一类是静态链接的可执行程序。

  静态可执行程序包含执行所需的所有函数。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。

2. 第二类是动态链接的可执行程序。
动态库是程序在

关于动态库设置的问题

通过源码包安装程序时,主要用到了“三大步”策略:configure、make和make install 。在安装的configure阶段,为了检测安装安装环境是否满足,通常情况下都是通过一个叫做pkg-config的工具来检测它需要依赖的动态库是否存在.

一般当我们安装完某个程序后,如果它提供了动态库的功能,在源码中都会有一个或多个以pc结尾的文件,当执行完make install后这些pc文件拷贝到${prefix}/lib/pkgconfig这个目录里,这里的prefix就是我们在configure阶段时通过配置参数–prefix指定的,缺省情况这个值就是/usr/local,所以这些pc文件最终会被拷贝到/usr/local/lib/pkgconfig目录下。

如果找不到某个库该怎么办。前提是你确确实实已经安装了它需要的库,原因只有一个,pkg-config找不到这个与这个库对应的pc文件。为什么会找不到呢,原因又有两点:
1. pkg-config搜索了所有它认为合适的目录都没找着这个库对应的pc文件的下落;
2. 这个库在发布时根本就没有提供它的pc文件。

pkg-config的查找路径是哪里?

pkg-config较老的版本里,缺省情况下会到/usr/lib/pkgconfig、/usr/loca/lib/pkgconfig、/usr/share/pkgconfig等目录下去搜索pc文件,据我所知在0.23以及之后的版本里pkg-config的源码里已经没有关于缺省搜索路径的任何硬编码的成分了,至于具体从哪个版本开始我也没有去追究,还望有知道的朋友分享一下。取而代之的是,当你看pkg-config的man手册时会有下面一段话:

pkg-config retrieves information about packages from special metadata files. These files are named after the package, with the extension .pc.
By default, pkg-config looks in the directory prefix/lib/pkgconfig for these files; it will also look in the colon-separated (on Windows, semicolon-separated) list of directories specified by the PKG_CONFIG_PATH environment variable.

以及

PKG_CONFIG_PATH
A colon-separated (on Windows, semicolon-separated) list of directories to search for .pc files. The default directory will always be searched after searching the path; the default is

${libdir}/pkgconfig and ${datadir}/pkgconfig

上面提到的prefix、libdir和datadir,就是安装pkg-config时被设定好的,具体情况是:
1、如果你是通过yum和rpm包安装的
prefix=/usr
libdir=pref

报错日志: [root@vdb1 script]# ./gs_expansion -U vastbase -G vastbase -h 192.168.248.140 -X ../cluster_config0721.xml Start expansion with cluster manager component. Start to send soft to each standby nodes. End to send soft to each standby nodes. Success to send XML to new nodes Start to perform perinstall on nodes: ['vdb4'] Preinstall command is: /tmp/gs_expansion_2025-07-21_13_22_17_999864/pkg/script/gs_preinstall -U vastbase -G vastbase -X /data/soft/vastbase-installer/cluster_config0721.xml -L --sep-env-file=/home/vastbase/.Vastbase --non-interactive 2>&1 Traceback (most recent call last): File "/data/soft/vastbase-installer/script/gspylib/threads/SshTool.py", line 609, in getSshStatusOutput raise Exception(ErrorCode.GAUSS_514["GAUSS_51400"] Exception: [GAUSS-51400] : Failed to execute the command: source /etc/profile && unset LD_LIBRARY_PATH && /data/soft/vastbase-installer/lib/python/bin/python3 /data/soft/vastbase-installer/script/gspylib/pssh/bin/pssh -t 310 -H vdb4 -P -p 300 -o /tmp/gauss_output_files_1405752_2025-07-21_13:22:19_199259_016 -e /tmp/gauss_error_files_1405752_2025-07-21_13:22:19_199259_016 "source /etc/profile;source /home/vastbase/.Vastbase;/tmp/gs_expansion_2025-07-21_13_22_17_999864/pkg/script/gs_preinstall -U vastbase -G vastbase -X /data/soft/vastbase-installer/cluster_config0721.xml -L --sep-env-file=/home/vastbase/.Vastbase --non-interactive 2>&1" 2>&1 | tee /tmp/gauss_result_1405752_2025-07-21_13:22:19_199259_016.log. Error: [1] 13:28:18 [FAILURE] vdb4 Timed out, Killed by signal Signals.SIGKILL During handling of the above exception, another exception occurred: Traceback (most recent call last): File "./gs_expansion", line 614, in <module> expansion.expand_run(expansion) File "./gs_expansion", line 447, in expand_run expand_impl.run() File "/data/soft/vastbase-installer/script/impl/expansion/expansion_impl_with_cm.py", line 558, in run self.do_preinstall() File "/data/soft/vastbase-installer/script/impl/expansion/expansion_impl_with_cm.py", line 470, in do_preinstall self.preinstall_run() File "/data/soft/vastbase-installer/script/impl/expansion/expansion_impl_with_cm.py", line 145, in preinstall_run self.ssh_tool.getSshStatusOutput(cmd, File "/data/soft/vastbase-installer/script/gspylib/threads/SshTool.py", line 650, in getSshStatusOutput raise Exception(str(e)) Exception: [GAUSS-51400] : Failed to execute the command: source /etc/profile && unset LD_LIBRARY_PATH && /data/soft/vastbase-installer/lib/python/bin/python3 /data/soft/vastbase-installer/script/gspylib/pssh/bin/pssh -t 310 -H vdb4 -P -p 300 -o /tmp/gauss_output_files_1405752_2025-07-21_13:22:19_199259_016 -e /tmp/gauss_error_files_1405752_2025-07-21_13:22:19_199259_016 "source /etc/profile;source /home/vastbase/.Vastbase;/tmp/gs_expansion_2025-07-21_13_22_17_999864/pkg/script/gs_preinstall -U vastbase -G vastbase -X /data/soft/vastbase-installer/cluster_config0721.xml -L --sep-env-file=/home/vastbase/.Vastbase --non-interactive 2>&1" 2>&1 | tee /tmp/gauss_result_1405752_2025-07-21_13:22:19_199259_016.log. Error: [1] 13:28:18 [FAILURE] vdb4 Timed out, Killed by signal Signals.SIGKILL
最新发布
07-22
Ubuntu 系统上下载并安装 OpenCV 是一个常见的任务,尤其在进行计算机视觉开发时。以下是详细的安装步骤,涵盖了从依赖安装、源码下载到编译安装的全过程。 ### 安装依赖 首先,需要安装构建 OpenCV 所需的开发工具和依赖。这些包括图像处理、视频编码、图形界面等相关的开发文件。 ```bash sudo apt install build-essential cmake git libgtk-3-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev openexr libatlas-base-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-dev gfortran -y ``` 此步骤确保系统具备所有必要的编译工具和文件,以便顺利编译和安装 OpenCV 。 ### 下载 OpenCV 源码 接下来,从 OpenCV 的官方 GitHub 仓克隆源代码。可以选择克隆主分支(通常是最新版本)或切换到特定版本的标签。 ```bash cd ~ git clone https://github.com/opencv/opencv.git cd opencv # 可选:切换到特定版本,例如 4.5.0 # git checkout 4.5.0 ``` 为了管理多个 OpenCV 版本,可以考虑将 OpenCV 安装到自定义目录,如 `/usr/local/opencv`。为此,需要编辑 `CMakeLists.txt` 文件,将 `set(CMAKE_INSTALL_PREFIX /usr/local)` 修改为 `set(CMAKE_INSTALL_PREFIX /usr/local/opencv)` 。 ### 编译和安装 OpenCV 进入 OpenCV 目录后,创建一个构建目录并进入该目录。使用 `cmake` 配置编译选项,并开始编译过程。 ```bash mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv .. make -j$(nproc) sudo make install ``` 编译完成后,OpenCV 将被安装到指定的目录中。为了使系统能够找到新安装的 OpenCV ,需要更新动态链接器的配置。 ```bash sudo sh -c 'echo "/usr/local/opencv/lib" >> /etc/ld.so.conf.d/opencv.conf' sudo ldconfig ``` 此外,还需要设置环境变量,以便在编译项目时能够找到 OpenCV 的头文件文件。可以在 `~/.bashrc` 文件中添加以下行: ```bash export PKG_CONFIG_PATH=/usr/local/opencv/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=/usr/local/opencv/lib:$LD_LIBRARY_PATH ``` 然后,应用更改: ```bash source ~/.bashrc ``` ### 验证安装 最后,可以通过检查 OpenCV 的版本来验证安装是否成功。 ```bash pkg-config --modversion opencv4 ``` 如果输出显示了 OpenCV 的版本号,则表示安装成功。 按你这么做没有生成opencv.pc 而且 pkg-config --modversion opencv4也说找不到文件怎么办
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值