所以我想建立一个程序并链接到共享库。共享库本身具有自己的依赖项。我正在尝试这样做,以便我只需要指定程序的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
)
答案 0 :(得分:0)
升级到scons版本2.4.1后,此问题现已解决。