Scons LIBS 链接,如何删除重复的 LIBS



我们在指定库依赖项时使用间接寻址,例如,

env.Program(TARGET, SOURCE, LIBS = [ $LIBS_A, $LIBS_B, $LIBS_C ])

LIBS_A、LIBS_B和LIBS_C在其他 SConscript 文件中指定。

假设:

LIBS_A/Sconscript has  LIBS_A = [ foo, bar, baz ]
LIBS_B/Sconscript has  LIBS_B = [ foo, bar, bat ]
LIBS_C/Sconscript has  LIBS_C = [ foo, bar, ben ]

然后,最终的链接器行将具有:

-lfoo -lbar -lbaz -lfoo -lbar -lbat -lfoo -lbar -lben

我们如何删除重复项并让链接器行读取:

-lfoo -lbar -lbaz -lbat -lben

这是怎么回事。 文件完全列出。

主.cxx

#include <iostream>
int main()
{
  std::cout << "Hello World!";
}

系统指令

env=Environment()
Export('env')
for l in ['A','B','C']:
    env.SConscript("LIBS_%s/SConscript"%l)
env.Program('myprogram',['main.cxx'], LIBS = list(set(env['LIBS_A'] + env['LIBS_B'] + env['LIBS_C'])))

LIBS_A/SConscript Import('env')

env['LIBS_A'] = ['foo','bar','baz']

LIBS_B/SConscript Import('env')

env['LIBS_B'] = ['foo','bar','bat']

LIBS_C/SConscript Import('env')

env['LIBS_C'] = ['foo','bar','ben']

收益 率:

g++ -o myprogram main.o -lbaz -lbat -lfoo -lbar -lben

如果这些都不适合您,那么这里有一种更复杂的方法:

class foo(object):
    def __init__(self, arg):
        self.arg = arg
    def __call__(self, target, source, env, for_signature):
        print "LIBS_A: %s  LIBS_B: %s"%(env['LIBS_A'],env['LIBS_B'])
        rc = list(set(env['LIBS_A']+env['LIBS_B']))
        print "Unique: %s"%rc
        print "SIG:%s"%for_signature
        return rc
# Will call our foo method to uniquify LIBS_*
env=Environment(FOO=foo, BAR="${FOO('$LIBS_A $LIBS_B')}")
env.Command('foo.XXXXX','foo.in',action="echo LIBS: $LIBS",LIBS="$BAR",
            LIBS_A=['a','b','c','d','e','f','f','b'],
            LIBS_B=['b','d','e','g','x'])
这对

我有用。非常感谢@bdbaddog

class uniquify_libs(object):
  def __init__(self, arg):
    self.arg = arg 
  def __call__(self, target, source, env, for_signature):
    rc = list(set(env.subst(env[self.arg])[0].split()))
    return rc
LIBS = ['$LIBS_A', '$LIBS_B'] ## defined in other SConscripts
Program(
  target  = TARGET,
  source  = SOURCE,
  UNIQUE  = uniquify_libs,
  MYLIBS  = LIBS,
  LIBS    = "${UNIQUE('MYLIBS')}",
)

最新更新