【问题标题】:linking with "local" version of a library与库的“本地”版本链接
【发布时间】:2011-08-27 13:08:43
【问题描述】:

您好,我正在尝试安装新版本的 zlib,但我没有 root 权限,所以我将在本地安装它。系统安装的是1.2.3,我正在尝试使用1.2.5

我喜欢编译

g++ -g myProg.cpp myOs.o -lpthread -IzlibInc/  -LzlibLib/ -lz  -o myProg

使用 ldd 它说

    ldd myProg
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c15800000)
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003c15c00000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c17400000)
libm.so.6 => /lib64/libm.so.6 (0x0000003c15400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c17000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003c14c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c14800000)

所以链接不正确。

谢谢

/////////////////////////////////////////////

更新

我有 2 个名为 zlibInc 和 zlibLib 的文件夹,其中包含标题和共享对象文件。

ls zlibLib/
libz.a  libz.so  libz.so.1  libz.so.1.2.5  pkgconfig
ls zlibInc/
zconf.h  zlib.h

我的源代码是

cat zlibTest.cpp
#include <cstdio>
#include <zlib.h>

int main(){
  fprintf(stderr,"%s\n",ZLIB_VERSION);
  int *a=new int[10];

  gzread(stdin,a,5);
  return 0;
}

而我的编译命令行是

g++ zlibTest.cpp   -I zlibInc/ -L zlibLib/ -L . -I . -lz;ldd a.out
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003c15c00000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c17400000)
libm.so.6 => /lib64/libm.so.6 (0x0000003c15400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c17000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003c14c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c14800000)

【问题讨论】:

  • 如果你把-lz放在第一位呢?此外,您可以将-pthread 作为编译器选项,因此您不必手动链接。

标签: linker g++ zlib


【解决方案1】:

它确实链接正确。本地 zlib 和系统范围的 zlib 具有相同的 SONAME,并且运行时链接器对您的本地版本一无所知。您可以为链接器提供-rpath 选项(-Wl,-rpath=./zlibLib),或者在运行时设置LD_LIBRARY_PATH 环境变量(LD_LIBRARY_PATH=./zlibLib:$LD_LIBRARY_PATH ./myProg)。

【讨论】:

  • 通常不建议将-rpath 设置为相对路径:您的程序运行方式会有所不同,具体取决于您是否在具有./zlibLib/ 子目录的目录中执行它。我建议改用-rpath=${PWD}/zlibLib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多