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 优先选择动态库还是静态库? 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐