2011-10-22 110 views

回答

3

适合你使用果酱!我想你会发现它比makefile更容易,一旦你经历了一些奇怪的事情。

你问的是我经常使用的设置。在顶层,我有三个目录:src,inc和build。还有一个名为Jamfile的文件:

# top-level Jamfile 
SubDir . ; 
SubInclude src ; 
SubInclude build ; 

的子目录行建立目录结构中该文件的位置,似乎是必要的果酱工作。 (我认为Jam可能被设计为不需要它,但是它就是这样。)SubInclude行告诉Jam包含两个子目录。 inc子目录不包含在内,因为没有任何内容需要直接编译;其所有内容将被其他文件包含。

在公司,我有一个头文件名为header.h:

/* header.h */ 
#define MESSAGE "Hello world!" 

在SRC,我的主要程序的源代码,main.c中:

/* main.c */ 
#include "header.h" 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    printf("%s\n", MESSAGE); 
    return 0; 
} 

而且SRC内是另一个包含以下内容的Jamfile:

# src/Jamfile 
SubDir .. src ; 
HDRS += ../inc ; 
Library helloworld : main.c ; 

SubDir行在目录结构中查找Jamfile。 HDRS行告诉Jam哪里可以找到额外的头文件(当时间到了的时候它会传递给编译器)。请注意使用+ =运算符,该运算符附加到现有变量。 Library行告诉Jam从main.c中构建一个库(是的,一个带main()的库有点奇怪,但在像这样的小项目中可以)。

在构建是单一的Jamfile:

# build/Jamfile 
SubDir .. build ; 
Main helloworld ; 
LinkLibraries helloworld : helloworld ; 
SubInclude .. src ; 

的子目录线所在的目录结构中的的Jamfile。主线告诉Jam构建一个名为helloworld的可执行文件。请注意,它没有源文件相关性。如果是这样,它看起来像Main hello world : foo.c ;。 LinkLibraries行告诉Jam将helloworld可执行文件与库(也称为helloworld)链接起来。在这种情况下,可执行文件和库名称相同,但在真正的程序中,您可能希望为它们提供不同(更好)的名称。 SubInclude行告诉Jam查看src目录以获取更多代码。这是如何解决可执行文件和库之间的依赖关系。这条线最后是重要的。

现在,如果您导航到构建目录并执行jam命令,Jam将在src中构建一个helloworld.a文件,并将其链接到build中的helloworld可执行文件中。

因为src中的所有代码都被编译到一个库中,所以没有剩下的.o文件。毕竟,它们都存储在.a文件中,这是一个档案。如果你在build中有其他的源文件(比如上面提到的假设的foo.c),那么在编译之后你会在build目录中留下.o文件。

祝你好运。我从Perforce website以及实验中了解了大部分关于Jam的知识。Jam的主要Perforce页面是here