Linker 链接到";“本地”;图书馆版本

Linker 链接到";“本地”;图书馆版本,linker,g++,zlib,Linker,G++,Zlib,嗨,我正在尝试安装一个新版本的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

嗨,我正在尝试安装一个新版本的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)
所以它没有正确链接

谢谢

/////////////////////////////////////////////
更新

我有两个名为zlibInc和zlibib的文件夹,其中包含头文件和共享对象文件

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;
}

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

如果您先放置
-lz
?另外,您可以将
-pthread
作为编译器选项,这样您就不必手动链接该选项。通常不建议将
-rpath
设置为相对路径:根据您是否在具有
/zlibLib/
子目录的目录中执行程序,程序的运行方式会有所不同。我建议改用
-rpath=${PWD}/zlibLib
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)