问题描述
我有一个使用CMake配置的应用程序,并使用GCC进行了构建。我在一个Linux系统上构建,并尝试在另一个Linux系统上运行。不幸的是,两个系统都提供同一个库的不同版本。例如GLEW,所以每当我尝试在第二个系统上运行可执行文件时,我都会得到以下提示:
./app
./app: error while loading shared libraries: libGLEW.so.2.0: cannot open shared object file: No such file or directory
ldd ./app | awk '{print $1}' | grep GLEW
libGLEW.so.2.0
ldconfig -p | grep GLEW
libGLEW.so.2.2 (libc6,x86-64) => /usr/lib/libGLEW.so.2.2
libGLEW.so.2.2 (ELF) => /usr/lib32/libGLEW.so.2.2
libGLEW.so.2.1 (libc6,x86-64) => /usr/lib/libGLEW.so.2.1
libGLEW.so (libc6,x86-64) => /usr/lib/libGLEW.so
libGLEW.so (ELF) => /usr/lib32/libGLEW.so
我实际上想配置CMake或其他引用“最小公分母”文件名的文件,因此它应该引用libGLEW.so.2.0
而不是libGLEW.so
[编辑] 构建器OS的一些其他输出:
cat CMakeCache.txt | grep GLEW
...
GLEW_LIBRARIES:FILEPATH=/usr/lib/x86_64-linux-gnu/libGLEW.so
...
ls -al /usr/lib/x86_64-linux-gnu/libGLEW.so
lrwxrwxrwx 1 root root 16 Jan 12 2019 /usr/lib/x86_64-linux-gnu/libGLEW.so -> libGLEW.so.2.1.0
因此,基本上CMake正确无误,但是GCC链接器跟随该链接并实际上放置了特定于版本的文件名作为参考。
解决方法
在这种情况下,我将指示cmake链接到共享库的通用名称,该通用名称应为libGLEW.so
或类似名称,并且是指向特定版本库的符号链接。检入/ usr / lib。如果在构建机器或执行机器上不存在,则可能需要创建它。但是,请注意,@ AlanBirtles指出,两个版本的libGLEW之间可能没有二进制兼容性。
从cmake 3.15开始,现在有一个cmake模块可以查找毛刺并更好地处理它。
这里是该模块的链接: https://cmake.org/cmake/help/latest/module/FindGLEW.html?highlight=glew
您应该能够从那里弄清楚。
,目前,我已经开始使用patchelf。该解决方案基于How can I change the filename of a shared library after building a program that depends on it?
- 在Linux构建主机上安装
patchelf
。以我为例, 所以apt-get install -y patchelf
- 检查应用程序依存关系:
patchelf --print-needed ./app
,在我的情况下会产生:
libSDL2-2.0.so.0
libpthread.so.0
libGL.so.1
libGLU.so.1
libGLEW.so.2.1
libfontconfig.so.1
libfreetype.so.6
libXcursor.so.1
libX11.so.6
libdl.so.2
libIL.so.1
libminizip.so.1
libz.so.1
libunwind.so.8
libvorbisfile.so.3
libopenal.so.1
libcurl.so.4
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6
- 接下来,替换所有缺少的库的链接。就我而言,只有
libGLEW.so.2.1
,所以patchelf --replace-needed libGLEW.so.2.1 libGLEW.so ./app
现在,重新验证链接库列表:patchelf --print-needed ./app
libSDL2-2.0.so.0
libpthread.so.0
libGL.so.1
libGLU.so.1
libGLEW.so
libfontconfig.so.1
libfreetype.so.6
libXcursor.so.1
libX11.so.6
libdl.so.2
libIL.so.1
libminizip.so.1
libz.so.1
libunwind.so.8
libvorbisfile.so.3
libopenal.so.1
libcurl.so.4
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6
注意libGLEW.so.2.1
更改为libGLEW.so
P.S。我认为这不是一个合适的解决方案,因此,一开始就如何正确处理链接的任何建议都值得欢迎。