Windows 上的 Cmake 不添加共享库路径(适用于 Linux)

2023-11-22

我在 Linux 上使用 CMake 和 Eclipse 一段时间了,并且一直在处理包含大量可执行文件和共享对象的多个目标项目。

我使用源代码构建,在 Linux 上,二进制文件被放入它们自己的目录中。当我在 Linux 上执行此操作时,Eclipse 能够以某种方式找到共享对象并正常运行可执行文件,但在 Windows 上这不会发生。

在 Windows 上,我必须添加一个指向 dll 的 PATH 环境变量,或者我可以构建到单个 bin 和 lib 目录中(尽管我过去忘记了 CMake 的一个问题,这让我想避免这种情况) 。

为什么 Windows 和 Linux 上的工作方式不同?这是我缺少的设置还是这不起作用?

构建本身运行完美。我正在使用 MinGW、Eclipse Kepler 和 Windows 7 64 位。

提前致谢。


Windows 根本不具备一些允许 CMake 设置构建环境的必要概念。链接时,Windows 将查找与二进制文件相同的目录,然后搜索 PATH 中的目录。没有像大多数 Unix 平台上使用的 RPATH 那样的东西可以注入其他更合适的路径。 DLL 通常应与二进制文件一起安装在同一目录中。

我认为,Windows 上的最佳实践是将 DLL 放在二进制文件旁边。 CMake 试图让这变得更容易,

install(TARGETS MyTarget
  EXPORT "MyProjectTargets"
  RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
  LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
  ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")

会将 DLL 安装到 RUNTIME 目标,但将库放在 LIBRARY 目标中。这意味着通常在类 Unix 操作系统上 lib 具有共享对象,但 CMake 知道 DLL 实际上是运行时的,并且会进入 bin 中。希望这能让事情变得更清楚。 CMake/Eclipse 不可能真正改进这么多,除了在单击 Eclipse 运行时将其他目录注入到您的 PATH 中之外(不确定这是否可能)。

如果您关心构建树,那么以下内容可以很好地工作(如下面的评论中所建议的):

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

如果您想允许覆盖它们(可能很有用),它们也应该使用 if(NOT var_name) 块进行保护。

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

Windows 上的 Cmake 不添加共享库路径(适用于 Linux) 的相关文章

随机推荐

  • 无法获取用户 IP 地址(代理/防火墙/负载均衡器)

    我之前使用下面的代码通过asp net获取客户端IP 但在我转移到VDS之后 这个函数开始只返回我的子网掩码 即178 18 198 1或178 18 198 2 谁能帮我解决这个问题吗 Private Function GetIPAddr
  • Spring:单元和集成测试

    我正在寻找使用 Spring 设置单元和集成测试的最佳实践 我通常使用 3 种测试 真正的 单元测试 无依赖项 测试作为 单元 测试运行 内存数据库 本地调用 模拟 对象 或作为集成测试 持久数据库 远程调用 测试仅作为集成测试运行 目前我
  • Flask-Login 显示 401,而不是重定向到登录视图

    使用 Flask Login 我想要求某些视图登录 当我尝试访问装饰有的视图时 login required 我收到 401 消息而不是登录页面 我该如何正确设置 from flask login import LoginManager l
  • jQuery 验证停止表单提交

    我正在使用 jQuery 验证表单 但是当验证表单时 它会重新加载或提交页面 我想停止该操作 我已经使用了 event preventDefault 但它不起作用 这是我的代码 step1form validate step1form on
  • Doctrine 不会在 Mysql 中保留具有布尔值和 PDO::ATTR_EMULATE_PREPARES = false 的实体

    我们正在使用 Symfony 来创建一些 Web 服务 我们使用 Doctrine ORM 来存储实体 使用 Doctrine DBAL 来检索数据 因为它非常轻 并且可以重用 ORM 实体管理器 连接 当使用 Doctrine DBAL
  • Django 模板中的数字 for 循环

    怎样写一个数字for在 Django 模板中循环 我的意思是像 for i 1 to n 我使用了一种简单的技术 非常适合没有特殊标签和附加上下文的小案例 有时这会派上用场 for i in 0123456789 make list for
  • 杀死一个正在运行的线程

    如果我们强行终止正在运行的线程会发生什么 我有一个线程RecordThread 它调用一些复杂且耗时的函数 在我使用的这些函数中试着抓块 分配和释放内存以及使用临界区变量等 like void RecordThread AddRecord
  • 使用 python 请求获取 eBay 访问令牌(交换身份验证令牌)

    我正在尝试使用本指南获取访问令牌 这是我的主文件 import requests from utils import make basic auth header conf code
  • Xamarin.Forms:Android 项目生成错误 - AppData\Local\Xamarin 文件夹内缺少文件

    我正在尝试 Xamarin Forms 我创建了一个名为 App2 的解决方案 Visual Studio 自动创建了以下项目 应用程序2 便携式 App2 Droid App2 iOS 当我尝试编译 Android 项目 App2 Dro
  • 标准 Android 菜单图标,例如刷新 [关闭]

    Closed 这个问题是无关 目前不接受答案 Android SDK 通过以下方式提供标准菜单图标android R drawable X 然而 一些标准图标 例如ic menu refresh 刷新图标 缺失android R 有没有办法
  • 在 XCode 6 中如何设置观察点而不停止执行?

    您可以按照以下步骤轻松在 XCode 中设置观察点 顺便说一句 如果有更简单的方法 我想知道 运行你的程序 在使用变量的代码中设置断点 到达断点时 右键单击变量并选择 Watch nameOfTheVariable 继续执行 唯一的问题是每
  • Backbone集合集合属性(针对url)

    我需要将 id 传递给集合以在 url 中使用 例如 user 1234 projects json 但我不知道如何执行此操作 一个示例会很棒 我的应用程序的结构方式是在启动时提取并呈现 用户 集合 然后我希望当用户单击时 将其 文档 从服
  • 在 PHP PDO postgres 中处理布尔输入?

    有没有更好的方法来处理布尔输入postgresPHP 中的 PDO 驱动程序 在 PHP PDO 中转换布尔值false到 和true到 1 这会导致某些语句中出现如下错误 00000 7 ERROR invalid input synta
  • 简单的语音识别方法

    是的 我知道语音识别相当复杂 轻描淡写 我正在寻找的是一种区分的方法maybe20 30 个短语 分割单词的能力 离散语音很好 会很好 但不是必需的 该软件将取决于用户 即供我使用 我不是在寻找现有的软件 而是在寻找一种自己做这件事的好方法
  • 如何在Windows中使用C#检测进程的开始和结束?

    我在 C 方面有很好的工作经验 但现在我想开发一个简单的 可能是控制台应用程序 软件 它只检测我的计算机上启动或结束的进程的名称和时间 例如 我假设我的小应用程序已经在运行 如果用户打开 Firefox 那么它应该随时间将 firefox
  • 更改 QLineEdit 中占位符文本的颜色

    当我设置占位符文本时QLineEdit setPlaceholderText 显示为灰色 有什么办法可以将颜色更改为其他颜色 例如红色 你必须子类化QLineEdit并在其中绘制您自己的占位符paintEvent class CustomC
  • WSL 2,React 不重新加载文件更改?

    我最近安装了 WSL 2 但是当我使用 create react app 创建应用程序并使用 npm start 时 当我编辑某些文件时 该应用程序不会重新加载 我错过了什么吗 根据我的经验 当您的源位于 Windows 驱动器上时 例如
  • 处理 Backbone 中的不可保存值

    是否有标准方法来处理 Backbone 中不可保存的值 e g MyModel Backbone extend Backbone Model initialize function this set inches this get mm 2
  • 使用jQuery获取div的绝对或相对位置position

    我会尝试解释我想要得到什么 我有一个 div 的位置 固定 在页面底部 到该 div 中 还有一些其他 div 我想要的是显示与这些 div 右侧对齐的另一个 div 具有绝对位置 换句话说 我不想知道 div 的左侧位置 相对于文档 ID
  • Windows 上的 Cmake 不添加共享库路径(适用于 Linux)

    我在 Linux 上使用 CMake 和 Eclipse 一段时间了 并且一直在处理包含大量可执行文件和共享对象的多个目标项目 我使用源代码构建 在 Linux 上 二进制文件被放入它们自己的目录中 当我在 Linux 上执行此操作时 Ec