我懷疑手冊實際上是在說我做錯了什麼,但我真的看不到解決方案;當要生成的.c文件和.o文件不在同一個目錄中時,會出現問題,並且.c文件對必須在運行中生成的.h文件具有自動依賴關係。這個問題可以通過手動設置.c和.h文件之間的依賴來解決,但我想避免這種情況。果醬對象規則和目錄
我有以下目錄結構:
weird/
Jamfile
b.c
src/
a.c
c.c
在src/AC文件是這樣的:
#include "src/a.h"
int main(int argc, char *argv[])
{
return 0;
}
公元前文件是這樣的:
#include "src/b.h"
int main(int argc, char *argv[])
{
return 0;
}
的SRC/cc文件是這樣的:
#include "c.h"
int main(int argc, char *argv[])
{
return 0;
}
的Jamfile中是:
rule CreateHeader
{
Clean clean : $(1) ;
}
actions CreateHeader
{
echo "int x = 10;" > $(1)
}
Object a.o : src/a.c ;
Object b.o : b.c ;
Object c.o : src/c.c ;
CreateHeader src/a.h ;
CreateHeader src/b.h ;
CreateHeader src/c.h ;
以下命令正確地創建B.O和src/b.h:
jam b.o
以下命令創建的src/A.H,但隨後GCC未能創建a.o;原因很明顯,在交流轉換器中的#include提到的src/A.H而實際上只應提及A.H:
jam a.o
以下命令將完全失效,甚至不創造c.h;其原因可能是,當果醬分析CC它所產生的通道,而不是SRC/CH的依賴,並在Jamfile中有產生CH沒有規則:
jam c.o
此命令編譯正確,如果我明確要求生成src/ch之前要求co:
jam src/c.h
jam c.o
在我看來,果醬src/ch應該沒有必要。這裏有什麼問題?有關更多信息,請參閱the Jam manual,特別是在標題文件掃描部分。
加入後,我接受了答案
我一直嘗試與接受答案的筆者建議構建一點點,我會在這裏發表的結果。在此設置中,您可以鍵入:
jam app
而應用程序將在bin/app下鏈接。不幸的是,我必須在設置LOCATE_TARGET時使用UNIX路徑,我的理解是這不是一個好的做法。
目錄結構:
project/
Jamfile
src/
main.c
gen/
bin/
obj/
文件的Jamfile:
SubDir TOP ;
rule CreateHeader
{
MakeLocate $(1) : $(LOCATE_SOURCE) ;
Clean clean : $(1) ;
}
actions CreateHeader
{
BUILD_DATE=`date`
echo "char build_date[] = \"$BUILD_DATE\";" > $(1)
}
SEARCH_SOURCE = src ;
LOCATE_TARGET = bin/obj ;
SubDirHdrs gen ;
Object main.o : main.c ;
LOCATE_TARGET = bin ;
MainFromObjects app : main.o ;
LOCATE_SOURCE = gen ;
CreateHeader info.h ;
文件的src/main。ç
src/main.c
#include <stdio.h>
#include "info.h"
int main(int argc, char *argv[])
{
printf("Program built with Jam on %s.\n", build_date);
return 0;
}