首页 > 解决方案 > 如何配置 CMake/CMakeLists.txt 以链接通用共享库文件名而不是特定的

问题描述

我有一个使用 CMake 配置并使用 GCC 构建的应用程序。我正在一个 Linux 系统上构建并尝试在另一个系统上运行它。不幸的是,两个系统都提供相同库的不同版本。例如 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 或其他任何东西来引用“最小公分母”文件名,所以libGLEW.so.2.0它应该引用libGLEW.so

[编辑] 构建器操作系统的一些额外输出:

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 链接器会跟随链接并实际放置一个特定于版本的文件名作为参考。

标签: c++cmakeshared-librariesldd

解决方案


在这种情况下,我将指示 cmake 链接到共享库通用名称,该名称应该是libGLEW.so或类似的,并且是指向特定版本库的符号链接。签入 /usr/lib。如果它在构建机器或执行机器上不存在,您可能需要创建它。但是,请注意,正如@AlanBirtles 指出的那样,两个版本的 libGLEW 之间可能不存在二进制兼容性。


推荐阅读