这个问题的其余部分是基于观点的,但最后一部分则少得多:
你能提供什么情况下更好地将makefile放在根目录、src/或其他某个目录中的案例吗?
首先,该目录可能不叫做 src/
而是其他名称。
有时候 Makefile
本身是生成的(例如通过 cmake 或 autoconf),它的生成器需要一些特定的文件树组织。
把所有源代码放在
src/
的常见原因是交叉编译或编译不同风格的目标(可能是调试版本和优化版本)。然后您将所有源代码放在
src/
中,并确保
make
(和
gcc
)不会将对象文件放入该
src/
目录,而是放入其他目录中(例如
obj-x86
用于X86对象文件,
obj-arm
用于ARM对象文件等),可能不仅特定于
ISA,还特定于
ABI。因此,您可能会将对象文件和可执行文件放在一个名字很长的目录中,例如
obj-x86_64-linux-optimized
和
obj-PowerPC-AIX-debug
。顺便说一下,
src/
目录甚至可以在多台机器上共享(例如通过
NFS挂载),并且只读(例如可由多个用户共享)。
请注意,
GCC 需要在其源代码树
之外 进行构建。
然后,
源代码 对于
make
(实际上是对于像
GCC 这样的编译器)和开发人员有一些
不同的含义。
源代码的社会定义(由开发人员使用)是:程序的
首选形式,在此形式下
人类开发人员工作(您将发现这个定义清楚地表达了自由软件运动的意愿)。
对于像GCC或Clang这样的编译器,源代码只是作为输入提供给编译器的翻译单元(即由gcc
编译器处理的.c
和.h
文件作为输入)。在许多(但不是所有)情况下,这些C文件是真正的源代码,因为人类开发者编写了它们。
在某些情况下,C或C++的“源”文件(由gcc
、g++
、clang
或clang++
所知)是“生成的”(在这种情况下,对于开发人员来说,它们不再是源代码,但对于gcc
来说仍然是输入源)。一个经典的例子当然是由bison生成的C文件。请参见this我的答案,以获取有关该想法的一般讨论。
另一个例子(其中C文件位于某个公共目录中)由特定领域(或高级)语言实现给出,这些语言被
编译成C(例如
Bigloo,
Chicken Scheme,我的旧
GCC MELT,甚至是上世纪80年代的旧C++前身C with classes)。
当这些实现更多或少(甚至完全)地进行了
引导时,您确实希望将生成的C文件放在一起,可能是在某个
src/
目录(或某个
generated/
目录)中。您甚至可以将这些放在版本控制系统(例如
git)下,尤其是对于只有一个实现的语言(否则,您将无法构建此类编译器;您需要生成的C代码来构建它,并稍后使用自身重新编译它),您肯定会在源
tarball中分发这些(生成的)C文件。
最后,成千上万个C或C++ -或Ocaml-文件的非常大的项目(甚至完全由人工编写)往往将这些文件分组到子目录中,特别是因为许多数千个
*.c
文件的单个大目录不适合人类阅读或友好。
相反,对于一个最多有几十个C源文件和手写Makefile的小型项目,代码行数不超过十万行,您最好将所有*.c和.h文件放在包含该Makefile的同一目录中。但是是否有src/目录,或者将编译器生成的目标文件放在包含源文件或Makefile的同一目录中,仍然在很大程度上取决于口味、意见、惯例和习惯。我建议研究类似于您的项目的自由软件项目(类似于
free software)在
github或其他地方的现有做法。
../XXX
”。 - kebsMakefile
是以某种方式(可能是由cmake
)生成的,需要特定的源树组织方式。这也取决于项目。 - Basile Starynkevitchsrc/
目录下更好的场景和原因吗? - Tim