【发布时间】:2016-03-01 20:26:40
【问题描述】:
免责声明:我是 CMakeLists.txt 的新手,我有一个可行的实现并希望改进和增强它,问题描述如下:
如果我想将 root/sub-directories/ 作为单独的子项目,可以使用其文件夹中的单个 CMakeLists.txts 进行编译,我发现自己实际上是在复制粘贴几乎整个根文件 CMakeLists.txt 每个子目录。
我想知道是否有更好的方法来拥有一个主项目,然后是从主项目获取共享依赖项的子项目,并且可以在没有 cmake-ing 根 CMakeLists.txt 的情况下进行编译。我的目录结构是;
CMakeLists.txt(根项目)
| __ sub_dir-1
| __ | __ CMakeLists.txt(子项目)
| __ sub_dir-2
| __ | __ CMakeLists.txt(子项目)
| __ sub_dir-3
| __ | __ CMakeLists.txt(子项目)
...
基本上,我希望能够:
-
cmake root/CMakeLists.txt,它创建了一个包含子项目的整个项目(我已经使用子目录中的单个 CMakeLists.txt 实现了这个。 -
cmake root/sub-dir/CMakeLists.txt和 only 编译子项目,它本质上还找到了必要的依赖项,并可能从.cmake包含或root/CMakeLists.txt中包含它们。处理这种结构的最佳方法是什么;- 同时保留第一个要点,即能够将其编译为整个项目。
- 还有没有拥挤
sub-dir/CMakeLists.txt有太多冗余代码?
感谢任何建议!谢谢。
【问题讨论】:
-
减少复制粘贴的方法有很多:
include()、function()/macro()、变量。您可能知道子项目,无论它们是单独构建还是作为根项目的一部分,通过检查变量/目标/函数并采取适当的措施。试着编程你想要的。 -
能够单独配置(cmake)项目和能够单独编译(make)它们之间有相当大的区别。我的经验是,您可以通过在顶层目录运行 cmake,然后指定要使用 make 构建的内容:
cmake <root-dir>; make sub-project1。什么对你来说最重要? -
@Emil 实际上两者都很重要,我希望能够使用
cmake配置它们,然后使用make作为子项目和主项目进行编译。 -
@Tsyvarev 我知道有很多方法,我希望有人能指出一种有效的方法,因为我列出了一些我想满足的限制。你会碰巧有一个我可以效仿的例子吗?
-
效率一种或另一种方法高度取决于具体情况。对于一种情况最有效的方法在其他情况下会过于复杂。提供一些(简化的)代码,在你的根项目和子项目之间是相似的,我(或其他人)将展示你可以减少代码重复的方法。
标签: cmake