C++ 如何设置使用VisualStudio样式的输出目录生成的Makefile?

C++ 如何设置使用VisualStudio样式的输出目录生成的Makefile?,c++,linux,build,makefile,C++,Linux,Build,Makefile,我有一个基于Linux的基本makefile项目。它还构建在Windows上的Visual Studio中 我想修改我的LinuxMakefile以创建多个具有不同二进制文件的构建,调试和发布开始,但可能会添加其他构建 如何设置Makefile项目,以不同的方式将源代码构建到不同的路径 例如,调试生成类似于: g++ -ggdb -Wall -DDEBUG .o files in ./Debug/obj .so and binary files in ./Debug/bin 发布输出将是: g

我有一个基于Linux的基本makefile项目。它还构建在Windows上的Visual Studio中

我想修改我的LinuxMakefile以创建多个具有不同二进制文件的构建,调试和发布开始,但可能会添加其他构建

如何设置Makefile项目,以不同的方式将源代码构建到不同的路径

例如,调试生成类似于:

g++ -ggdb -Wall -DDEBUG
.o files in ./Debug/obj
.so and binary files in ./Debug/bin
发布输出将是:

g++ -Os -Wall
.o files in ./Release/obj
.so and binary files in ./Release/bin
makedebug或makerelease将使它们成为可能,或者makeall将完成一切

我知道如何在一个Makefile中创建多个构建类型,但我真正不清楚的部分是设置输出目录和设置要检查的.o文件目录,以查看是否已构建源文件


欢迎指向相关示例和文档的指针。

一种方法是让您的项目支持配置机制(类似于Autoconf的
/configure
脚本),以便可以在源目录以外的目录中配置。然后您可以用不同的方式配置和构建它

另一种方法是使用
lndir
工具创建符号链接的构建树。这将立即为几乎任何项目添加多构建功能。其思想是,您有一个镜像目录树,由指向原始目录树中原始文件的符号链接填充。程序的构建系统一点也不明智(除非它做了一些愚蠢的事情,比如规范化路径、删除符号链接:Lisp构建系统ASDF的维护人员,请注意!)。它通过符号链接访问文件,但在本地删除对象。好在源目录可以是完全原始的,甚至是只读的!您可以做得比清理干净更好:只需关闭
lndir
生成的链接场,即可获得完全原始的状态

我使用这样的技巧为几种体系结构(所有包:glibc、gcc、apache,随便你怎么说)构建了一个Linux发行版

这一切都是从同一个工作副本;相同的未打包来源


将这种支持侵入项目将是最后的手段。如果你喜欢GNU Make语言,那就去吧。请从头到尾阅读GNU Make的信息手册两三遍,然后离开。。。我知道怎么做,我也这样做过,但这有什么意义呢。解释起来需要一些空间,不值得。

花点时间阅读,前往GNU Make的维护者,阅读以下两篇文章:

然后,您可能会明白,在当前目录之外的目录中构建不是一个好主意,因为这意味着违反了Make的规则


这些文章还将指导您如何组织构建,它可能正好适合您的特定情况。

符号链接树的缺点是,尽管您可以轻松地通过符号链接进行编辑(例如,通过编辑器中的错误浏览支持修复编译错误),但如果您添加了文件,您必须记住将其添加到原始树中并刷新符号链接。这没什么大不了的,但鞋里的一块小石头走了几英里后会变成一个大麻烦。谢谢你,这很有帮助,正是我所需要的。