2016-02-05 41 views
0

所以我想构建一个程序并链接到共享库。共享库本身有它们自己的依赖关系。我试图做到这一点,所以我只需要在本程序的SConscript中指定直接共享库的依赖关系,而不是共享库本身所依赖的内容,而这些依赖项可以在自己的SConscript中捕获。因此,如果一个基础库创建了一个依赖项,并且40个程序遍布整个代码库,那么所有40个SConscript文件都不必更新以反映新增的lib依赖项的添加。它应该被自动继承。Scons:如何在使用变量替换时创建LIB依赖

为了说明这种情况,假设我有两个共享库项目(projA和projB)。 ProjA需要一些boost库,而projB需要另一套boost库。如果我想构建一个依赖于projA和projB共享库的程序,我想指定一个只包含projA和projB的LIBS =变量,但在调用该动作时会解析为所有需要的库(从而选取提升每个依赖的库)。

但是,当我使用变量替换时,scons不能正确识别依赖关系,因此scons不会构建库(projA和projB)。对scons的重复调用最终会构建所有内容,所以就好像它不能在第一遍中创建所有的依赖关系连接。

在程序生成器LIBS =行中使用变量替换时,如何使scons检测依赖关系。

更新:反复调用scons后,它将最终构建一切并正确链接。看起来scons正确地识别了依赖关系,因为当使用scons --tree = derived,prune选项时,libs显示出来,但这只在没有构建错误时才起作用,所以只有在重复调用scons并且我们终于拥有了所有东西建成。

我收到的错误是库未找到链接器错误。这些库不是建立的,所以错误是有道理的。但是为什么libs没有被构建,scons会按照-tree选项中的报告来选择它们呢?

样品下面SConscript:


ProjA/SConscript:

Import('env') 
TARGET = 'projA' 
LIBS = [ 
'boost_date_time' 
'boost_filesystem' 
] 
TARGET_LIBS = 'LIBS_' + TARGET 
env[TARGET_LIBS] = [TARGET, LIBS] 
env.SharedLibrary(
    target = TARGET, 
    source = projA.cpp 
) 

ProjB/SConscript:

Import('env') 
TARGET = 'projb' 
LIBS = [ 
'boost_thread' 
'boost_serialization' 
] 
TARGET_LIBS = 'LIBS_' + TARGET 
env[TARGET_LIBS] = [TARGET, LIBS] 
env.SharedLibrary(
    target = TARGET, 
    source = projB.cpp 
) 

MyExecutable/SConscript:

TARGET = 'myExecutable' 
LIBS = [ 
    '$LIBS_other_projA', 
    '$LIBS_other_projB', 
] 

env.Program(
    target = TARGET, 
    LIBS = LIBS, # this should interploate to projA, boost_date_time, boost_filesystem, projB, boost_thread, boost_serialization (which it does, but it doesn't create all the dependencies immediately, so projB doesn't get built, requires a second invocation 
    source = myExecutable.cpp 
) 
+0

您分配给'env [TARGET_LIBS]',但我没有看到您使用它?虽然可能并不重要...... – dirkbaechle

+0

@dirkbaechle它在LIBS的定义中用于MyExecutable/SConscript。 $ LIBS_other_projA解析为env字典,因此它将是env [$ LIBS_other_projA]。请注意,env [TARGET_LIBS] == env [LIBS_other_projA] – rkemp

+0

我在Scons版本2.3.4上,我怀疑这是固定在2.4.1,因为我在ProgScanner中看到一个新函数。等待批准从我们的IT部门下载最新的scons。希望能解决这个问题。 – rkemp

回答

0

升级到scons版本2.4.1后,此问题现已解决。

相关问题