cmake - 如何使用非版本化库名称

问题描述 投票:0回答:1

我需要链接的库的文件名中有一个版本,例如 libSomeLib-1.2.so

如果我告诉 cmake 使用“SomeLib-1.2”,它会这样做,但如果我使用“SomeLib”,则找不到该库。

我真的不想在 CMakeLists.txt 中指定版本,这样如果将来库版本发生变化,我就不必更新。

我尝试了一些关于查找 libSomeLib*.so 并创建符号链接的主题的变体。这适用于命令行,但 cmake 将 * 视为文字字符而不是“任何”。

我知道我可以编写一个Python脚本来获取库的路径并创建一个符号链接,如果SO无法提供帮助,我会这样做。

我更愿意在 CMakeLists.txt 中执行此操作,看起来应该是可能的。

cmake
1个回答
0
投票

当我问这个问题时,最重要的答案基本上是我不应该尝试这样做,因为库版本可能不匹配。 很公平。但是这个 CMake 配置正在跨许多不同的平台构建通用代码,并且它们有不同版本的 libSomeLib-X.Y.so 所以事实证明我确实需要符号链接。好吧,我可以花时间找出所有平台使用的版本,并列出 CMake 使用的选项列表。但我正在尝试这个。我意识到通配符已经过时了,但它完成了工作。测试文件是否存在,以防某些平台没有版本文本。

if(不存在“${CMAKE_SYSROOT}/usr/lib/libSomeLib.so” 文件(GLOB_RECURSE SOME_LIB“${CMAKE_SYSROOT}/usr/lib/libSomeLib*.so”) 文件(CREATE_LINK“${SOME_LIB}”“${CMAKE_SYSROOT}/usr/lib/libSomeLib.so”符号) 结束() target_link_libraries(myProgram someLib)

此解决方案可能很脆弱,因为如果“libSomeLib*.so”有多个匹配项,则 glob 将包含一个 ; 分隔的列表,并且符号链接将仅指向该列表文本并被破坏。但应该只有一个。我将在现在构建的许多平台上进行测试,看看会发生什么,但到目前为止一切顺利。

© www.soinside.com 2019 - 2024. All rights reserved.