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

2024-02-13

当我跑步时FindPackage(PythonLibs),它首先找到静态 python 库 python3.5m.a,而不是 python3.5m.so。这是 CMake 的预期行为吗?我怀疑它不符合CMake 错误报告 https://cmake.org/Bug/view.php?id=1643;然而,这个错误报告是在 2005 年提交的。13 年里事情发生了变化。如果共享库有优先权,那么你知道为什么 CMake 会找到静态库而不是共享库吗?

我已经解决了构建问题,只需使用以下命令告诉 CMake 我自己的构建的正确库在哪里SET()命令。我正在寻找一个答案,以便更好地理解 CMake 在这种情况下的行为,因为我正在尝试解决一个不同的问题problem https://stackoverflow.com/questions/49784583/numpy-import-fails-on-multiarray-extension-library-when-called-from-embedded-pyt,并且在共享库上找到静态对我来说似乎很奇怪。 谢谢!

系统/问题信息:

  • Ubuntu 16.04,64 位
  • 编译Python 3.5.5并启用共享
  • CMake 3.11.0
  • 根据 Tsyvarev 评论进行编辑:共享库和静态库位于同一目录中

如果您查看 cmake 文件,特别是第 142-163 行的 FindPythonLibs.cmake (CMake 3.11.0),在我看来,它会找到共享库,然后找到静态库,但我又不是 CMake 的专家(它是一个 CMake 菜鸟,试图在很少的上下文中找出源代码的作用)。

感谢您抽出宝贵的时间来阅读这个问题。任何帮助表示赞赏。

编辑:2018 年 4 月 13 日

嗯,这很有趣。我检查了 CMAKE_FIND_LIBRARY_SUFFIXES 变量,其值为:“.so.a”。这几乎变得足够有趣,让我弄清楚如何按照此调试 CMake 文件问题/答案 https://stackoverflow.com/questions/22803607/how-to-debug-cmakelists-txt-files。当/如果我有时间的话,我会再次更新我的帖子。

编辑 2018 年 4 月 16 日

好吧,我开始准备进行调试过程。当我准备好时,我发现了错误。当我构建 python 3.5.5 的共享版本时,我忘记删除 CMakeCache.txt,因此 FIND_PACKAGE 命令没有重新运行。感谢您花时间回答这个问题,Tsyvarev。我学到了一些新东西。


如果静态库和共享库都是在同一目录下,您可以尝试通过指定库的首选项CMAKE_FIND_LIBRARY_SUFFIXES https://cmake.org/cmake/help/v3.9/variable/CMAKE_FIND_LIBRARY_SUFFIXES.html多变的:

# Prefer dynamic libraries to static ones
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")

不要忘记清除 CMake 缓存(CMakeCache.txt文件在构建目录中),然后重新搜索库。


库位于同一目录中的要求很重要:

标准算法查找库 https://cmake.org/cmake/help/v3.9/command/find_library.html命令在切换到下一个目录之前搜索目录中所有可能的库名称。此行为被更改为NAMES_PER_DIR选项,但很少在“查找”脚本中使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake FindPackage(PythonLibs):CMake 优先选择动态库还是静态库? 的相关文章

随机推荐