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

CMake FindPackage(PythonLibs): Does CMake give a preference to dynamic or static libraries?

本文关键字:CMake 动态 选择 静态 FindPackage PythonLibs 是否      更新时间:2023-10-16

当我运行FindPackage(PythonLibs)时,它首先找到静态python库python3.5m.a,而不是 python3.5m.so。这是 CMake 的预期行为吗?我怀疑它不符合 CMake 错误报告;但是,此错误报告是在 2005 年提交的。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的共享版本时.txt我忘记删除CMakeCache,因此FIND_PACKAGE命令没有重新运行。谢谢你花时间回答这个问题,齐瓦列夫。我学到了一些新东西。

如果静态库和共享库位于同一目录中,您可以尝试通过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选项更改,但很少在"查找"脚本中使用。