c++ - 如何配置 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 链接器会跟随链接并实际放置一个特定于版本的文件名作为参考。
解决方案
在这种情况下,我将指示 cmake 链接到共享库通用名称,该名称应该是libGLEW.so
或类似的,并且是指向特定版本库的符号链接。签入 /usr/lib。如果它在构建机器或执行机器上不存在,您可能需要创建它。但是,请注意,正如@AlanBirtles 指出的那样,两个版本的 libGLEW 之间可能不存在二进制兼容性。
推荐阅读
- python - 如何比较来自两个不同字典的相同键值
- python - 修改保存在 .txt 文件中的列表
- multithreading - Guile Scheme 并行表单加速
- nginx - nginx 配置加载 angular6 应用程序作为主应用程序的模块
- django - 如何在 reactjs 中从 json 动态创建菜单项?
- sql - 哪个 Join 用于 SQL 加查询
- c# - CNN 媒体:content media="image" SyndicationFeed
- php - 使用 php 从数据库创建页面 [就像框架或 cms 正在做的事情]
- ruby-on-rails - html 按钮 onclick 功能在 html.erb 环境中不起作用
- typescript - 打字稿重载错误