CMake FindPackage(PythonLibs):CMake 是否优先选择动态库或静态库?
CMake FindPackage(PythonLibs): Does CMake give a preference to dynamic or static libraries?
当我运行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选项更改,但很少在"查找"脚本中使用。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- CMAKE:动态作业池更改
- 如何在Windows上链接动态构建的cmake文件
- 如何使用cmake设置OpenCV以启用动态和静态构建
- 如何将动态链接库与CMake一起使用
- 当我链接动态库而不是静态库时,CMake 有效
- 无法在 CMake 中创建动态库并将其链接到另一个动态库?
- CMake FindPackage(PythonLibs):CMake 是否优先选择动态库或静态库?
- 如何使用 CMake 正确设置动态库路径
- 使用 Cmake 安装时创建动态库
- CMake:使静态库有效,但动态库不起作用
- CMAKE OS X CLION.如何链接自定义动态库
- 将GLEW与CMake动态链接
- 动态链接错误cmake
- CMAKE:阅读和编译CPP文件的动态生成列表
- 在MacOS上编译一个动态库,库搜索路径指向同一目录(CMake)
- 创建一个可部署的CMake动态SDL2应用程序
- 如何使用CMake选择性地链接静态或动态提升库
- 与CMake链接的C++动态和静态库
- 如何在cmake中动态设置目标库