CMake FindPackage(PythonLibs):CMake是否优先选择动态库还是静态库?

4
当我运行FindPackage(PythonLibs)时,它首先找到静态Python库python3.5m.a,而不是python3.5m.so。这是CMake的预期行为吗?我怀疑不是,根据CMake bug report;但是,这个bug报告是在13年前提交的。事情随时间改变。如果共享库具有优先级,那么为什么CMake会找到静态库而不是共享库?
我已经通过使用SET()命令告诉CMake我的构建正确的库位置来解决了构建问题。我正在寻找一个答案,以便更好地理解CMake在这种情况下的行为,因为我正在尝试解决一个不同的问题,并且发现静态库优先于共享库对我来说似乎很奇怪。
系统/问题信息: Ubuntu 16.04,64位 编译Python 3.5.5启用共享 CMake 3.11.0 根据Tsyvarev评论进行编辑:共享和静态库在同一个目录中
如果您查看CMake文件,特别是FindPythonLibs.cmake(CMake 3.11.0)的142-163行,我认为它首先找到共享库,然后是静态库,但再次说明我不是CMake专家(这是一个CMake新手尝试从非常少的上下文中挑选源代码做什么)。
谢谢您抽出时间阅读这个问题。任何帮助都将不胜感激。
编辑:4/13/18
好吧,这很有趣。我检查了CMAKE_FIND_LIBRARY_SUFFIXES变量,并且值为:".so.a"。这几乎变得足够有趣,让我想弄清楚如何根据这个问题/答案调试CMake文件。当/如果我开始时,我会再次更新我的帖子。
编辑4/16/18
好吧,我开始准备进行调试过程。当我准备好时,我发现了错误。在构建Python 3.5.5的共享版本时,我忘记删除CMakeCache.txt,因此FIND_PACKAGE命令没有重新运行。感谢您抽出时间回答这个问题,Tsyvarev。我学到了新东西。

3
如果静态库和共享库在同一个目录下,你可以通过CMAKE_FIND_LIBRARY_SUFFIXES变量来指定库的偏好:set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")。记得在重新搜索库之前清除CMake缓存(CMakeCache.txt)。 - Tsyvarev
不错的技巧,我从未知道可以那样做。如果两个库在同一个目录中,您是否知道有关于使用共享库还是静态库的内置偏好设置? - skincell
1
任何偏好都是通过变量(CMAKE_FIND_LIBRARY_SUFFIXES)来表达的。您甚至可以读取它的值以确定默认情况下首选哪个库。但是,我不知道CMake有关默认设置此变量的策略:从技术上讲(但不太可能),当读取其默认值时,您可能会在一个CMake版本中获得一个值,在另一个版本中获得另一个值。 - Tsyvarev
当我浏览了您之前的答案/评论@Tsyvarev时,我实际上对此有了线索,其中您建议或有人建议删除CMakeCache.txt。一旦我看到那个,我就有了一种沉重的感觉,但我一直在否认它,直到我真正遇到它。我可以总结关于库的动态与静态偏好的答案,或者您可以。让我知道您的偏好。 - skincell
1个回答

2
如果静态库和共享库在同一目录中,您可以尝试通过CMAKE_FIND_LIBRARY_SUFFIXES变量指定库的偏好设置:
# Prefer dynamic libraries to static ones
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")

请不要忘记在重新搜索库之前清除CMake缓存(建立目录中的CMakeCache.txt文件)。
将库定位在同一目录中的要求非常重要: find_library命令的标准算法会在切换到下一个目录之前在一个目录中搜索所有可能的库名称。尽管 NAMES_PER_DIR 选项可以改变这种行为,但它很少在“查找”脚本中使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接