假設我有一個SConstruct
文件看起來像這樣:如何解決「scons的:警告:兩種不同的環境中對目標指定爲」
env = Environment()
env.Program("a", ["a.c", "util.c"])
env.Program("b", ["b.c", "util.c"])
此版本工作正常,沒有SCons的警告消息。但是,如果我修改這個指定不同庫每個Program
版本(實際庫不相關):
env.Program("a", ["a.c", "util.c"], LIBS="m")
env.Program("b", ["b.c", "util.c"], LIBS="c")
然後我得到警告:
scons: warning: Two different environments were specified for target util.o, but they appear to have the same action: $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
這似乎引起由Program
建設者自動創建一個新的環境來構建源,儘管它只是LIBS
變量是不同的(所以只有鏈接步驟需要有不同的環境)。我可以解決這個做類似:
util = env.Object("util.c")
env.Program("a", ["a.c"] + util, LIBS="m")
env.Program("b", ["b.c"] + util, LIBS="c")
它使用一個單一的Object
建設者建設util.c
,然後使用預編譯的目標文件中的每個Program
構建,從而避免了警告。但是,這不應該是必要的。有沒有更好的方法來解決這個問題?或者這實際上是一個應該修復的SCons中的錯誤?
上下文:我有將近2000個C源文件編譯到大約20個庫和120個可執行文件中,這些文件有很多共享源。我使用我寫的轉換腳本創建了以前專有構建系統中的SConstruct
文件。 SCons使用我目前的SConstruct
有大約450個「兩種不同環境」的警告信息。
我投了這個解決方案,因爲它不需要我記住每個對象編譯到哪個環境。所有的都被編譯成一個單一的環境。它還允許SConscript文件乾淨。我修改了create_obj函數來不自動追加.cpp後綴 – 2013-02-17 17:29:10