CMAKE_*_OUTPUT_DIRECTORY 的正确使用

2024-04-03

前言:我是only谈论本地编译,not关于安装项目。这是因为我还没有对适当的研究进行足够的研究install使用 CMake,但如果我的问题直接涉及到,请插话install实践(似乎有可能)。

TL;DR

  1. 你在什么场景下not想要将所有正在构建的项目库收集到同一目录中吗?为什么从来没有人CACHE the CMAKE_*_OUTPUT_DIRECTORY paths?

  2. 是否有必要执行$<CONFIG>直接等级规格?

  3. 一般默认值应该是CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

1. 缓存还是不缓存?

From 这个优秀的答案 https://stackoverflow.com/a/6595001/3814202

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

您在网络上的许多项目中都可以看到这一点。

  • 家长CMakeLists.txt cannot覆盖这些。
  • 如果父项目想要/需要更改这些,例如将所有内容放在同一个文件夹中,这是不可能的。

所以建议的修改是always CACHE PATH "description":

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled static libraries.")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled shared libraries.")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Where to place compiled executables.")
  • 有什么理由吗not缓存?

2. 治疗$<CONFIG> builds

这个应该差不多always留给发电机,是吗?我的理解(和经验)是通过设置非配置生成器(Visual Studio,XCode,...),使用每个配置构建的文件夹仍然满足于将东西放置在通常的位置。又称为不设置配置级别CMAKE_*_OUTPUT_DIRECTORY_*我将控制权传递给生成器让它决定。

3. BINARY_DIR, CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

另一方面,假设开发人员确实not希望他们正在构建的其他项目最终位于同一目录中。如果不是我使用的进一步情况CMAKE_CURRENT_BINARY_DIR OR PROJECT_BINARY_DIR?如果只是一个原始的CMAKE_BINARY_DIR被使用,没有CACHE,那么我绝对没有办法prevent我正在构建的一个子项目最终位于我的旁边。

通过使用CMAKE_CURRENT_BINARY_DIR or PROJECT_BINARY_DIR,如果用户这样做not希望这个库最终位于父项目旁边,他们可以简单地设置CMAKE_*_OUTPUT_DIRECTORY变量after配置这个。

Summary

基本上,对于如何使用这些变量似乎没有任何标准。我对 CMake 的多功能性感到兴奋,我并不是说他们应该在这里做任何默认设置——这将由项目决定。我试图了解最合适的默认选择是什么,这也允许开发人员绕过我的默认选择(如果他们选择的话)。


我和@Tsyvarev 在一起。我没有看到启用 CMake 的项目的用户想要更改构建工件的输出路径,而只想更改安装路径。

1. 缓存还是不缓存?

只是不要设置CMAKE_*_OUTPUT_DIRECTORY变量缓存,因为如果另一个 CMake 项目使用您的项目作为子项目,您在某些情况下会覆盖父项目的设置(缓存变量是全局的)。

2. 治疗$<CONFIG> builds

是的。仅当生成器的默认值不适合时才会给出(“配置名称”=“子文件夹名称”)。

3. CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

所以我想说保存变体是首先检查if ()声明如果其他人已经设置了变量并且还可以使用PROJECT_BINARY_DIR https://cmake.org/cmake/help/latest/variable/PROJECT_BINARY_DIR.html:

if (NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
endif()

然后,您的项目的用户仍然可以从外部设置变量,或者父项目可以设置它,并且如果未设置,您将拥有默认值。

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

CMAKE_*_OUTPUT_DIRECTORY 的正确使用 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐