Scons:如何在使用变量替换时创建LIB依赖关系

时间:2016-02-05 02:08:35

标签: c++ scons

所以我想建立一个程序并链接到共享库。共享库本身具有自己的依赖项。我正在尝试这样做,以便我只需要指定程序的SConscript上的直接共享库依赖项,而不是共享库本身所依赖的内容,这将在它们自己的SConscripts中捕获。

因此,如果基础库创建了依赖于整个代码库中的40个程序依赖的依赖项,则不必更新所有40个SConscript文件以反映新的lib依赖项的添加。它应该自动继承。

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

但是,当我使用变量替换时,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
)

1 个答案:

答案 0 :(得分:0)

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