Questions tagged «cmake»

5
使用常见的嵌套子模块组织Git存储库
我是Git子模块的忠实粉丝。我希望能够跟踪依赖关系及其版本,以便您可以回滚到项目的先前版本,并具有相应版本的依赖关系,以安全,干净地进行构建。此外,将我们的库作为开放源代码项目发布更容易,因为库的历史记录与依赖于它们的应用程序的历史记录是分开的(并且不会公开)。 我正在为工作中的多个项目设置工作流程,我想知道如果我们采用这种方法有点极端,而不是拥有一个整体项目会怎么样。我很快意识到,在真正使用子模块时,可能存在蠕虫病毒。 假设有一对应用程序:studio和player,以及依赖库core,graph和network,其中依赖关系如下: core 是独立的 graph取决于core(的子模块./libs/core) network依赖于core(的子模块./libs/core) studio取决于graph和network(位于./libs/graph和的子模块./libs/network) player取决于graph和network(位于./libs/graph和的子模块./libs/network) 假设我们正在使用CMake,并且每个项目都有单元测试和所有工作。每个项目(包括studio和player)都必须能够独立编译以执行代码指标,单元测试等。 事情是,递归的git submodule fetch,然后您将获得以下目录结构: studio/ studio/libs/ (sub-module depth: 1) studio/libs/graph/ studio/libs/graph/libs/ (sub-module depth: 2) studio/libs/graph/libs/core/ studio/libs/network/ studio/libs/network/libs/ (sub-module depth: 2) studio/libs/network/libs/core/ 注意core在studio项目中克隆了两次。除了浪费磁盘空间之外,我还有一个构建系统问题,因为我要构建core两次,并且有可能获得的两个不同版本core。 题 如何组织子模块,以便获得版本化的依赖关系和独立的构建,而无需获取公共嵌套子模块的多个副本? 可能的解决方案 如果库依赖关系只是一个建议(例如,以“已知可与版本X一起使用”或“仅正式支持版本X”的方式),并且潜在的依赖应用程序或库负责使用其喜欢的任何版本进行构建,则我可以想象以下情形: 让构建系统知道graph并network告诉他们在哪里core(例如,通过编译器包含路径)。定义两个构建目标:“独立”和“依赖”,其中“独立”基于“依赖”,并添加包含路径以指向本地core子模块。 引入额外的依赖性:studio上core。然后,studio建立core,设置包括它自己的拷贝路径core子模块,然后建立graph与network在“依赖”模式。 生成的文件夹结构如下所示: studio/ studio/libs/ (sub-module depth: 1) studio/libs/core/ studio/libs/graph/ studio/libs/graph/libs/ (empty folder, sub-modules not …
50 git  cmake  submodules 

8
直接使用Make做过时了吗?[关闭]
因此,我遇到了很多有关直接创建makefile的评论/帖子/等等,以及在2015年如何做是一件愚蠢的事情。我知道诸如CMake之类的工具,实际上我经常使用CMake。事实是,CMake只是为您创建Makefile,并帮助消除了您自己做的乏味。当然,它还添加了许多其他强大的功能……但是最后它仍然是一个Makefile。 所以我的问题是,关于make的“过时”讨论是指整个Make实用程序,还是仅仅是手动编写自己的Makefile的想法?我根本不使用IDE进行C / C ++开发(只是emacs),所以我总是写Makefile。 如果Make被认为已经过时,那么C / C ++开发人员应该使用什么来构建小型个人项目?
31 c++  c  builds  make  cmake 

6
为什么makefile应该有一个“安装”目标?
来自C和C ++的世界,大多数构建系统都有一个install目标,尤其是Makefiles(例如,GNU建议在其中)或CMake。此目标在操作系统(例如,在C:\Program Files\Windows中)中复制运行时文件(可执行文件,库等)。 这感觉确实很棘手,因为对我而言,安装程序不是构建系统的责任(实际上是操作系统/程序包管理器的责任)。这也意味着构建系统或构建脚本必须知道已安装程序的组织,以及环境变量,注册表变量,符号链接,权限等。 充其量,构建系统应该有一个release目标,该目标将输出可安装的程序(例如.deb或.msi),然后请操作系统安装该程序。它还将允许用户无需键入即可卸载make uninstall。 所以,我的问题是:为什么构建系统通常建议有install目标?

4
用C ++编写构建脚本是否有意义?
我正在使用CMake生成我的项目IDE / makefile,但是我仍然需要调用自定义“脚本”来操纵我的编译文件甚至生成代码。 在以前的项目中,我一直在使用Python,而且还可以,但是现在在我正在处理的两个非常大的项目中管理很多依赖项时遇到了严重的麻烦,因此我想尽可能减少所有地方的依赖项。 有人建议我使用C ++编写我的构建脚本,而不是为此添加语言依赖。项目主题本身已经使用C ++,所以我可以看到几个优点: 要构建整个项目,只需要一个C ++编译器和CMake,就没有其他必要了(所有其他依赖项都是C或C ++); C ++类型的安全性(使用现代C ++时)使一切变得更容易“正确”; 它也是我所熟悉的语言,因此即使我能够编写一些不错的Python代码,也可以更轻松地使用它。 潜在的执行速度提升(但我认为这不会真正被察觉); 但是,我认为可能会有一些缺点,并且由于我尚未尝试,所以不确定真正的影响: 编写代码的时间可能会更长(也就是说,我不确定,因为我在C ++中足够高效,可以编写可以快速工作的东西,因此对于该系统来说,编写它不会太长)(编译时间不应在这种情况下是一个问题); 我必须假定我将作为输入阅读的所有文本文件都在UTF-8中,我不确定可以在运行时使用C ++轻松地对其进行检查,并且该语言不会为您进行检查。 C ++库比脚本语言更难管理。 我缺乏经验和前瞻性,所以也许我没有优势和劣势。所以问题是:为此使用C ++是否有意义?您有报告的经验吗,您是否看到了可能重要的优点和缺点?

1
包含多个项目的CMake(C ++)存储库的目录组织
我想为存储在单个(git)存储库中的一组相关但独立的C ++项目的组织提供一些建议。这些项目使用CMake。 对于一个简化的示例,我们假设有两个项目A和B,A取决于B。大多数开发A的人都会通过包装系统获得B。因此,它们只能编译A。但是,我们应该允许开发人员分别或一起编译A和B(并安装)。 这是一个建议: └── Repo1 ├── CMakeLists.txt (1) ├── A │ ├── CMakeLists.txt (2) │ ├── include │ │ ├── aaa.h │ │ ├── aaaa.h │ │ └── CMakeLists.txt (3) │ └── src │ ├── aaa.cpp │ ├── aaaa.cpp │ └── CMakeLists.txt (4) ├── B │ ├── CMakeLists.txt (2) …

1
源内构建与源外构建
在我的(主要是C ++)开发中,我一直坚持使用源代码之外的版本。也就是说,我的来源通常坐落在一个/project/src目录和建立生活在一个/project/build/bin/release,/project/build/bin/debug目录。之所以这样做,是因为它可以使我的源目录与中间文件保持干净,我的所有二进制文件都位于一个位置,打包更容易,清理更容易,版本控制也更容易。(我有什么想念吗?) 我现在正在继承一个使用源代码内部构建的(大型)项目。这种结构的动机是什么,它的优点是什么?(我最关心的是工程级别的原因与个人喜好类型的原因。) 我希望拉科斯(Lakos)的“大型C ++软件设计”能在其中发挥作用,但如果这样做,我会错过它。

2
生成自动化:通常将QMake用于非Qt项目吗?
因此,我打算编写一个C ++库,并且希望它可以跨平台使用,并且因为该库将不处理UI,并且希望它具有尽可能小的依赖关系,所以我不会使用Qt (实际上,Qt并不能真正帮助我实现我想要的功能,我计划使用的只是STL和Boost)。现在,当涉及到构建跨平台项目时,我真的很喜欢QMake,因为它非常易于使用,并且我对此有经验。我也听到了有关CMake的好消息,尽管我真的怀疑它与QMake一样容易使用。 无论如何,这是我的问题:我应该坚持使用我所知道的构建自动化工具,还是QMake只是出于非Qt项目的背景?我应该以此为契机学习CMake吗?还是这两个有更好的选择?
9 c++  cmake 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.