繁体   English   中英

仅编译linux终端中已编辑的文件

[英]Compiling only edited files in linux terminal

我在Linux操作系统中创建了一个包含大量.cpp.h文件的项目,问题是每次我想编译和运行项目时我都要编译所有内容,否则它不起作用。 例如:

g ++ main.cpp test.cpp test2.cpp test3.cpp test1.h test2.h test3.h -o main

有没有办法,当我只编辑main.cpp时,我不必重新编译所有内容

g ++ main.cpp -o main

我建议使用makefile来完成这项工作,因为它们在构建依赖项方面非常出色。

https://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/makefile.html

如果main.cpp使用来自test * .cpp的代码,则不能编译main.cpp。 您可以使用g++ -c test.cpp将单个文件编译为目标文件,然后使用g++ main.cpp test.o test2.o test3.o -o main链接这些文件。 如果您学习使用make ,则可以将此过程自动化为仅在需要时重新编译目标文件。

您的头文件通常应该是源文件中的#include d,因此您无需在命令行上显式地提供它们。

增量编译非常标准,是工程最佳实践。 但是,要实现渐进式编译(至少以理智且可持续的方式实际节省您的时间),您需要使用构建系统来跟踪依赖关系并确定自上次调用之后哪些目标/输入已更改构建系统,它可以自动调用编译器来编译和链接实际需要更新的目标。

对于构建系统的选择,我建议研究Gradle (在开源项目中非常流行)或Bazel (谷歌的构建系统最近开源,虽然不太受欢迎)。 从历史上看, Make (以及自动生成Makefile的系统,如AutoconfCMake )一直是常见的构建系统,特别是在C ++开发人员中; 然而,与更现代的构建系统相比,这些工具的普及程度越来越低,并且使得构建配置更加复杂,并且易于在脚下拍摄(例如,Gradle和Bazel构建了可跨系统移植的配置文件,而Makefile使得无意中依赖于特定于操作系统或特定于编译器的细节使得构建过程变得不可移植相对容易.Make确实有一些非常便携的规则来避免可移植性问题,但在设计makefile时必须非常小心以确保不使用非便携式指令)。 有关更全面的C ++构建系统列表,请查看我的C ++资源页面。

至于这些构建系统如何实现增量构建; 基本上,他们会将每个* .cpp文件分别编译成自己的* .o文件,并保留* .o文件。 然后将每个* .o文件链接在一起以生成最终的构建输出。 因此,只重新生成输入比* .o文件更新的* .o文件; 类似地,只有那些* .o输入比生成的库或可执行文件更新的库或可执行文件才会被重新创建。 简而言之,这些构建系统将进行相当复杂的依赖性分析,以确定哪些文件已更改/要重建哪些目标,并将多次调用g ++(而不仅仅是一次)。 这就是为什么我强烈建议使用构建系统自动化它而不是尝试手动执行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM