【问题标题】:scons fails to resolve relative source pathscons 无法解析相对源路径
【发布时间】:2017-11-17 05:36:18
【问题描述】:

我的项目结构如下:

/prj
    SConstruct
    /src
        /app
        /lib1
        /lib2
        /...

'/prj/src/lib1'结构:

/lib1
    /src
    /test
    SConscript

'lib1/SConscript':

SConscript('test/test1/SConscript',
            exports = 'env',
            variant_dir = '#build/release/lib1/test', 
            duplicate = 0)

最后是“测试”目录:

/test
    /common
        helpers.cpp
    /test1
        SConscript
        main.cpp

在 'test/test1/SConscript' 源中指定为:

Sources = ['../common/helpers.cpp', 'main.cpp']

结果:

scons: *** [build/release/lib1/common/helpers.o] 
Source `build/release/lib1/common/helpers.cpp' not found, 
needed by target `build/release/lib1/common/helpers.o'

可以看出,问题在于 scons 试图在构建目录中查找源文件“helpers.cpp”,而不是在源代码一中。

一些研究表明,当源文件路径以“../”开头时会出现问题。当“SConscript”文件下定义的所有源都正常时。

Scons v2.5.1 和 v3.0.1 表现出相同的行为。

我做错了什么?我在作者建议的地方找到了this answer:

您可以使用 ../test.cpp 作为文件名

但我做的完全一样。这种 scons 行为是故意的还是这是一个错误?

【问题讨论】:

    标签: scons


    【解决方案1】:

    你在“lib1/SConscript”中的“代码”:

    SConscript('test/test1/SConscript',
                exports = 'env',
                variant_dir = '#build/release/lib1/test', 
                duplicate = 0)
    

    使用给定“test/test1/SConscript”的名称并将文件夹“test/test1”作为“变体文件夹”(=variant_dir) 隐式链接到目标目录“#build/release/lib1/test”。因此,如果在“#build/release/lib1/test”中找不到所需的文件,SCons 会尝试在“test/test1/”中进行替代“查找”。但此链接也不会自动为“common”文件夹设置,这就是“helpers.cpp”查找失败的原因。这是 SCons 中的预期行为和正确的。

    解决您当前问题的方法是将“test/test1/SConscript”移至更高的文件夹级别,将其中的源包括为“common/helpers.cpp”和“test/main.cpp”并从“lib1/SConscript”调用这个新的 SConscript "如:

    SConscript('test/SConscript',
                exports = 'env',
                variant_dir = '#build/release/lib1/test', 
                duplicate = 0)
    

    【讨论】:

    • 是的,我已经按照您的建议解决了问题(您的帖子提高了我对问题的理解,谢谢)。唯一的缺点是,在这种情况下,我不得不将所有测试子项目的定义放在位于“测试”目录级别的同一个 SConscript 文件中。如果有很多测试,这可能会很不方便,更重要的是——这种方法结合了所有测试项目的构建,而不是单独构建任何测试二进制文件的能力。
    • 1) 您可以在命令行中指定一个(或多个)目标作为参数:“scons build/.../testa build/.../testb”。 2) 例如,您可以拥有多个 SConscript,并通过“scons -f SConscript.testa”在它们之间进行选择。 3)项目设置,就像你上面给出的例子一样,总是受益于从你的“common”源中创建一个单独的库。然后您可以将其添加到环境的 LIBS 变量中,并简单地自己构建您的测试程序。我猜它没有比这更轻巧的了。只是为了给你一些进一步的想法。 ;)
    • 从“通用”来源创建库是个好主意,谢谢!我是否正确理解路径中带有前导“../”的文件对 scons 来说不是问题? IE。例如,如果一个项目使用位于以上几个级别(主项目包含目录)的头文件(带有 Q_OBJECT 宏),scons 将正确解析“variant_folder”并为该文件启动 moc?
    • 是的,前导 "../" 应该不是问题...只要生成的路径是顶级 SConstruct 所在目录的子文件夹。另见 #2我们的most-frequently-asked FAQs (页面顶部,“我如何安装文件?”)。
    猜你喜欢
    • 2017-12-15
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2020-11-12
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多