我是 SCons 的新手,注意到当我在 SConscript 中构建共享库时,CCCOMSTR 和 LINKCOMSTR 将不起作用。
这是我的 SConstruct 的简化版本:
CFLAGS = ["-Wall", "-pedantic", "-std=c99"]
# building environment
env = Environment(CFLAGS = CFLAGS, CPPDEFINES = ["DEBUG"])
# checking dependencies
conf = env.Configure()
conf.CheckHeader("stdlib.h")
conf.CheckHeader("string.h")
conf.CheckLib("libdl")
env["CCCOMSTR"] = "Compiling $SOURCE ..."
env["LINKCOMSTR"] = "Linking $TARGET ..."
SConscript(dirs = ["lib1", "lib2"], exports=["env", "conf"], name = "SConscript")
# main function
env.Program(target = "prog", LIBS=["libdl"], source = Glob("*.c"))
库 SConscript 看起来像:
Import("env", "conf")
env.SharedLibrary(target = "test1", source = Glob("*.c"))
我的期望是 env["CCCOMSTR"]
和 env["LINKCOMSTR"]
应该通过导入传播并正确显示。然而,这并没有发生,我看到的是 gcc/clang 命令。在 SConscript 中设置这些变量也没有任何区别。
输出如下:
scons: Reading SConscript files ...
Checking for C header file stdlib.h... (cached) yes
Checking for C header file string.h... (cached) yes
Checking for C library libdl... (cached) yes
scons: done reading SConscript files.
scons: Building targets ...
Compiling log.c ...
Compiling main.c ...
clang -o lib1/test1.os -c -Wall -pedantic -std=c99 -g -fPIC -DDEBUG lib1/test1.c
clang -o lib1/libtest1.so -shared lib1/test1.os -ldl
clang -o lib2/test2.os -c -Wall -pedantic -std=c99 -g -fPIC -DDEBUG lib2/test2.c
clang -o lib2/libtest2.so -shared lib2/test2.os -ldl
Compiling xalloc.c ...
Linking prog ...
scons: done building targets.
这只是 SCons 错误还是我在这里做错了什么?在网上找不到太多关于它的信息,因此在这里问。 :)
(我试过并显示上述行为的 SCONS 版本是 v2.1.0、v2.3.4)
经过一些研究,我找到了答案,现在它正确显示了:
...
env["SHCCCOMSTR"] = "SHCC $SOURCE"
env["SHLINKCOMSTR"] = "SHLINK $TARGET"
env["CCCOMSTR"] = "CC $SOURCE"
env["LINKCOMSTR"] = "LINK $TARGET"
...
我以为我以前试过这个但没有用,但显然出了点问题,因为它现在可以用了。所以更改后的输出如下(符合预期):
...
CC log.c
CC main.c
SHCC lib1/test1.c
SHLINK lib1/libtest1.so
SHCC lib2/test2.c
SHLINK lib2/libtest2.so
CC util.c
CC xalloc.c
LINK prog
哦,好吧 - SCons 似乎工作正常,实际上非常棒!
我是一名优秀的程序员,十分优秀!