.so后面有数字,如何在cmake的find_library中匹配它们?链接作为子依赖项找到的共享对象时出错

use*_*142 4 cmake shared-libraries dynamic-linking shared-objects gstreamer

给出的
ls -lrt /usr/lib/libvpx*结果

lrwxrwxrwx 1 root root 2012年2月9日15日 /usr/lib/libvpx.so.1.0 ->libvpx.so.1.0.0
lrwxrwxrwx 1 root root 2012年2月9日15日 /usr/lib/libvpx.so.1 -> libvpx.so .1.0.0
-rw-r--r-- 1 root root 646120 2012 年 2 月 9 日 /usr/lib/libvpx.so.1.0.0

ls -lrt /usr/lib/libschroedinger*结果

lrwxrwxrwx 1 root root 29 Feb 8 2012 /usr/lib/libschroedinger-1.0.so.0 ->libschroedinger-1.0.so.0.11.0
-rw-r--r-- 1 root root 774044 Feb 8 2012 /usr/ lib/libschroedinger-1.0.so.0.11.0

ls -lrt /usr/lib/libgsm*结果

lrwxrwxrwx 1 root root 16 Nov 5 2009 /usr/lib/libgsm.so.1 -> libgsm.so.1.0.12
-rw-r--r-- 1 root root 50680 Nov 5 2009 /usr/lib/libgsm.所以.1.0.12

这是该问题的方法 1 中发现的问题的可能解决方案。您可以/不可以提及该内容。

可能的解决方案
正如我在父问题中提到的,我们可能需要添加三个find_library()函数。以下是 CMakeLists.txt 的内容

可能的解决方案1a

find_library(VPX_LIBRARIES 名称 libvpx.so.1 路径 /usr/lib/ )
find_library(SCHROEDINGER_LIBRARIES 名称 libschroedinger-1.0.so.0-1.0 路径 /usr/lib/) find_library(GSM_LIBRARIES 名称 libgsm.so.1 路径 /usr/lib / )

target_link_libraries(MyLibraryOrMyExecutable ${VPX_LIBRARIES} ${SCHROEDINGER_LIBRARIES} ${GSM_LIBRARIES} )

可能的解决方案 1b

find_library(VPX_LIBRARIES 名称 vpx 路径 /usr/lib/)
find_library(SCHROEDINGER_LIBRARIES 名称 schroedinger-1.0 路径 /usr/lib/) find_library(GSM_LIBRARIES 名称 gsm 路径 /usr/lib/)

target_link_libraries(MyLibraryOrMyExecutable ${VPX_LIBRARIES} ${SCHROEDINGER_LIBRARIES} ${GSM_LIBRARIES} )

错误
我对解决方案 1a 和 1b 都遇到相同的错误

CMake 错误:此项目中使用了以下变量,但它们被设置为 NOTFOUND。请设置它们或确保它们在 CMake 文件中正确设置和测试:

GSM_LIBRARIES
由目录 /someDirectory 中的目标“MyLibraryOrMyExecutable”链接

SCHROEDINGER_LIBRARIES
由目录 /someDirectory 中的目标“MyLibraryOrMyExecutable”链接

VPX_LIBRARIES
由目录 /someDirectory 中的目标“MyLibraryOrMyExecutable”链接

cmake 在从 find_library() 读取 NAMES 中的 vpx 后查找 libvpx.so,但找到了一个不同的文件,例如 libvpx.so.1,因此我也使用了 1b,其中我给出了确切的名称。但仍然没有运气。

问:如何解决这样的问题:共享对象的名称在扩展名后还包含一个数字,并且确切的名称与 中给出的名称不匹配find_library()。?我试图给出确切的名称,但这也行不通

小智 7

命令find_library使用CMAKE_FIND_LIBRARY_SUFFIXESCMAKE_FIND_LIBRARY_PREFIXES变量来粘合真实的库名称。例如:

> cat CMakeLists.txt
message("suffixes: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
message("prefixes: ${CMAKE_FIND_LIBRARY_PREFIXES}")
> cmake -H. -B_builds
suffixes: .so;.a
prefixes: lib
Run Code Online (Sandbox Code Playgroud)

CMAKE_FIND_LIBRARY_SUFFIXES是一个列表变量,您可以添加新后缀:

> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .so.17)
find_library(library edata-book-1.2)
message("library: ${library}")
> cmake -H. -B_builds
library: /usr/lib/libedata-book-1.2.so.17
Run Code Online (Sandbox Code Playgroud)

我很确定这里真正的问题是包管理器的使用(:通常 lib<name>.so是文件的符号链接lib<name>.so.N.M。所以我建议您检查手册并以适当的方式安装您的库。