程序员开发实例大全宝库

网站首页 > 编程文章 正文

C++开发:升级GCC,源码安装GCC,ld.so.conf动态库配置,ldd用法

zazugpt 2024-10-23 16:50:55 编程文章 17 ℃ 0 评论

手动编译安装

如果需要最新版本的 GCC,可以手动下载源码并编译安装。这种方法适合需要特定版本或自定义编译选项的情况。

# 下载 GCC 源码(假设最新版本是 12.2.0)
wget http://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
tar -xzf gcc-12.2.0.tar.gz
cd gcc-12.2.0

# 下载依赖
./contrib/download_prerequisites

# 创建构建目录
mkdir build
cd build

# 配置和编译
../configure --disable-multilib
make -j$(nproc)

# 安装
sudo make install

gcc ld.so.conf动态库配置

1. 添加库路径到ld.so.conf

首先,你需要将包含库文件的目录添加到 /etc/ld.so.conf 或创建一个新的配置文件在 /etc/ld.so.conf.d/ 目录下。

假设你的库文件位于 /usr/local/lib/gcc 和 /export/gcc-12.2.0/libphobos/libdruntime/gcc,你可以创建一个新的配置文件,例如 /etc/ld.so.conf.d/gcc-12.2.conf:

sudo nano /etc/ld.so.conf.d/gcc-12.2.conf

然后添加以下内容:

/usr/local/lib/gcc
/export/gcc-12.2.0/libphobos/libdruntime/gcc

保存并退出编辑器。

2. 运行ldconfig更新缓存

更新动态链接库缓存:

sudo ldconfig

3. 更新环境变量

为了确保系统可以找到新的 GCC 可执行文件和库,你还需要更新环境变量 PATH 和 LD_LIBRARY_PATH。你可以将这些变量添加到你的 shell 配置文件(例如 ~/.bashrc 或 ~/.zshrc)中。

编辑你的 shell 配置文件:

nano ~/.bashrc

添加以下内容:

# 添加 GCC 可执行文件路径
export PATH=/usr/local/bin/gcc:/app/third-party/gcc:/export/gcc-12.2.0/gcc:/export/gcc-12.2.0/build/gcc:$PATH

# 添加 GCC 库文件路径
export LD_LIBRARY_PATH=/usr/local/lib/gcc:/export/gcc-12.2.0/libphobos/libdruntime/gcc:$LD_LIBRARY_PATH

保存并退出编辑器,然后重新加载配置文件:

source ~/.bashrc

4. 验证配置

验证你的设置是否正确:

# 检查 GCC 版本
gcc --version

# 检查库路径是否已添加
echo $LD_LIBRARY_PATH

如果一切配置正确,系统应该能够找到并使用你安装的 GCC 12.2 及其相关库。

lld命令用法

在 Linux 系统中,查看二进制文件的动态库依赖关系通常使用 ldd 命令。ldd 命令列出可执行文件或共享库所依赖的所有共享库。

使用ldd查看动态库依赖

假设你有一个可执行文件 my_program 或一个共享库 libmylib.so,你可以使用以下命令查看其动态库依赖:

ldd my_program

ldd libmylib.so

示例

假设你有一个名为 my_program 的可执行文件,你可以运行以下命令来查看其依赖的库:

ldd my_program

输出可能如下:

linux-vdso.so.1 (0x00007fffd5d8d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9c3d1b0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9c3cfc0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9c3d4c0000)

解释输出

  • linux-vdso.so.1:这是一个虚拟动态共享对象,通常由内核提供。
  • libm.so.6 和 libc.so.6:这些是标准的 C 库和数学库。
  • /lib64/ld-linux-x86-64.so.2:这是动态链接器/加载器。

如果找不到库

如果某些库未找到,ldd 输出中会显示 not found。例如:

libmylib.so.1 => not found

这种情况通常表示库文件未在系统的标准库路径中。你可以通过以下方法解决:

添加库路径到 LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH

将库路径添加到 ld.so.conf 并运行 ldconfig:

编辑 /etc/ld.so.conf.d/ 目录下的配置文件,添加库路径,然后运行 ldconfig:

sudo nano /etc/ld.so.conf.d/my_custom_libs.conf

添加以下内容:

/path/to/your/library

保存并退出编辑器,然后更新缓存:

sudo ldconfig

使用objdump查看详细信息

如果你需要更详细的信息,可以使用 objdump 工具。objdump 是 GNU Binutils 中的一个工具,可以显示二进制文件的各种信息。

例如,查看动态库依赖:

objdump -p my_program | grep NEEDED

输出可能如下:

  NEEDED               libm.so.6
  NEEDED               libc.so.6


错误处理

GCC 12.2 已安装 ,依旧报错/lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found 

排查问题

strings /path/to/your/gcc/lib64/libstdc++.so.6 | grep GLIBCXX

如果输出中包含 GLIBCXX_3.4.29,说明你的 GCC 12.2 确实包含这个符号。



本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表