如何配置CMake/CMakeLists.txt链接通用共享库文件名而不是特定文件名



我有一个使用CMake配置并使用GCC构建的应用程序。我正在一个Linux系统上构建,并尝试在另一个系统上运行它。不幸的是,这两个系统都提供相同lib的不同版本。例如GLEW,所以每当我试图在第二个系统上运行可执行文件时,我都会得到以下信息:

./app
./app: error while loading shared libraries: libGLEW.so.2.0: cannot open shared object file: No such file or directory

以下是app参考的相关输出以及我在系统中的内容。

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或任何引用";最小公分母";filename,所以它应该引用libGLEW.so而不是libGLEW.so.2.0

[EDIT]生成器操作系统的一些附加输出:

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模块可以找到glew并更好地处理它。

以下是模块链接:https://cmake.org/cmake/help/latest/module/FindGLEW.html?highlight=glew

你应该能够从那里弄清楚。

现在我已经集中使用patchelf。该解决方案基于"在构建依赖共享库的程序后,如何更改共享库的文件名?"?

  1. 在linux构建主机上安装patchelf。就我而言,它是ubuntu,所以apt-get install -y patchelf
  2. 检查应用程序依赖项: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
  1. 接下来替换所有缺失库的链接。在我的情况下,只有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

第页。S.我认为这不是一个合适的解决方案,所以任何关于如何正确处理链接的建议都是非常受欢迎的。

最新更新