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

时间:2018-04-12 20:33:41

标签: c++ cmake linker ubuntu-16.04

当我运行FindPackage(PythonLibs)时,它首先找到静态python库,python3.5m.a,而不是python3.5m.so。这是CMake的预期行为吗?我怀疑它不是CMake bug report;然而,这个错误报告是在2005年提交的。事情发生了13年的变化。如果共享库有偏好,那么任何想法为什么CMake会在共享库上找到静态库?

我已经修复了构建问题,只需使用SET()命令告诉CMake适合我自己构建的库。我正在寻找一个能够更好地理解CMake在这种情况下的行为的答案,因为我试图解决不同的problem,并在共享库中找到静态对我来说似乎很奇怪。 谢谢!

系统/问题信息:

  • Ubuntu 16.04,64位
  • 已编译的Python 3.5.5 with enabled-shared
  • CMake 3.11.0
  • 根据Tsyvarev评论编辑:共享和静态库位于同一目录中

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

感谢您抽出时间阅读此问题。任何帮助表示赞赏。

编辑:4/13/18

嗯,这很有意思。我检查了CMAKE_FIND_LIBRARY_SUFFIXES变量,其值为:" .so.a"。这几乎变得非常有趣,让我弄清楚如何根据question/answer调试CMake文件。当/如果我接触它,我会再次更新我的帖子。

编辑4/16/18

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

1 个答案:

答案 0 :(得分: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 选项更改了此行为,但它很少用于"查找"脚本。