Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该将项目的makefile放在哪里?_Makefile_Gnu Make - Fatal编程技术网

我应该将项目的makefile放在哪里?

我应该将项目的makefile放在哪里?,makefile,gnu-make,Makefile,Gnu Make,假设项目的目录包含子目录,如src,bin,lib,doc,等等。我应该将项目的makefile放在哪里 比如说, 一些项目将其makefile放在项目根目录的src/子目录中 有些项目将其makefile放在项目的根目录中 第二种方式对我来说更有逻辑性。您能否提供一些案例,说明出于什么原因最好将makefile放在根目录、src/或其他目录中?问题的其余部分是基于意见的,但最后一部分则不太基于意见: 您是否可以提供将makefile放在根目录、src/或其他目录中更好的情况,原因是什么 首

假设项目的目录包含子目录,如
src
bin
lib
doc
,等等。我应该将项目的makefile放在哪里

比如说,

  • 一些项目将其makefile放在项目根目录的
    src/
    子目录中

  • 有些项目将其makefile放在项目的根目录中


第二种方式对我来说更有逻辑性。您能否提供一些案例,说明出于什么原因最好将makefile放在根目录、
src/
或其他目录中?

问题的其余部分是基于意见的,但最后一部分则不太基于意见:

您是否可以提供将makefile放在根目录、src/或其他目录中更好的情况,原因是什么

首先,该目录可能不会被称为
src/
,而是以其他方式被称为

有时,
Makefile
本身是由或生成的,其生成器需要特定的文件树组织

将所有源代码放在
src/
中的一个常见原因是交叉编译,或者编译不同风格的目标(可能是调试版本,也可能是优化版本)。然后将所有源代码放入
src/
目录,并确保
make
(和
gcc
)不会将对象文件放入该
src/
目录,而是放入其他目录(例如,对于x86对象文件,
obj-x86
,对于arm对象文件,
obj-arm
,等等),这可能不仅是特定的,而且也是特定的。因此,您可以将对象文件和可执行文件放在一个长的命名目录中,例如
obj-x86\u 64-linux-optimized
obj PowerPC AIX debug
。顺便说一句,
src/
目录甚至可以在多台机器上共享(如挂载)和只读(如可由多个用户共享)

请注意,需要构建它的源树

然后,对于
make
(实际上,对于像这样的编译器)和开发人员来说,它有着不同的含义

源代码的社会定义(开发人员使用)是:人类开发人员工作的程序的首选形式(你会发现自由软件运动清楚地表达了这个定义)

对于像或这样的编译器,源代码只是作为编译器的输入提供的(即
.c
.h
文件,作为
gcc
编译器的输入处理)。在许多(但不是所有)情况下,这样的C文件都是真正的源代码,因为是由开发人员编写的

<>在某些情况下,生成C或C++源代码文件(如代码< GCC < /COD>或<代码> G++< /COD>或<代码> CLAN<代码>或<代码> CLAN++/COD> >(在这种情况下,对于开发人员来说,它们不再是源代码,但对于<代码> GCC 它们仍然是输入源)。一个经典的例子当然是由生成的C文件。关于这个想法的一般性讨论见我的答案

另一个例子(其中C文件位于某个公共目录中)由特定于域(或高级)的语言实现给出(例如,my old,甚至是80年代C++的前身——带有类的旧C)

当这样的实现或多或少(甚至完全)时,您确实希望将生成的C文件保存在一起,可能在一些
src/
目录中(或一些
generated/
one)。你甚至可以把它们放在你的版本控制系统下(例如),特别是对于只有一个实现的语言(否则,你将无法构建这样一个编译器;你需要生成的C代码来构建它,然后自己重新编译),你肯定会在源代码中分发这样的(生成的)C文件

最后,成千上万个C或C++或OcAML文件(甚至完全是人类编写的)的大型项目倾向于将这些文件分组在子目录中,特别是因为成千上万个代码“>*.c/Cuth>文件”的单个大目录不是(或友好的)人类“可读的”。 相反,对于一个手工编写的

Makefile
的几十个C源文件中最多有十万行代码的小项目,最好将所有
*.C
&
.h
文件放在包含该
Makefile
的同一目录中


但是是否有一些
src/
目录
,或者是否将编译器生成的目标文件放在包含源文件或
Makefile
的同一目录中,在很大程度上仍然是一个品味、观点、惯例和习惯的问题。我建议研究项目中的现有实践(与您的项目类似)或其他地方。

在我看来,根文件夹是最自然的。而且最简单的是,由于文件路径总是“向下”,所以您不必编写“
。/XXX
”。这实际上是一个意见(和惯例)问题。在某些情况下,
Makefile
是以某种方式生成的(可能是通过
cmake
),这需要源树的特定组织。这也取决于project@BasileStarynkevitch您能否提供一些案例,说明为什么最好将makefile放入
src/
,原因是什么?@BasileStarynkevitch“这确实是一个意见问题”。同意,因此,我想知道这个问题是否应该结束。@Ralphteninja约定仍然只是意见,因此它们属于堆栈溢出的POB结束原因。无论如何,我把问题的意见因素缩小了不少,投票决定重新讨论这个问题;巴兹尔的回答为一个悬而未决的问题提供了一个很好的答案。