Scons层次化构建与存储库目录

0 投票
1 回答
998 浏览
提问于 2025-04-16 06:14

我有一个SCons项目,设置如下:

proj/
    SConstruct
    src/
        c/
        h/
    app1/SConscript
    app2/SConscript
    ...

每个应用程序的所有源文件和头文件都放在src/c和src/h文件夹里。


  1. 第一步,我在app1文件夹里创建了一个文件,并使用了Repository功能。

...

src=Split("main.c first.c second.c")

env = Environment(CC='g++', CCFLAGS=['-O0', '-ggdb'], CPPPATH=['.'])

env.Program('appone', src)

Repository("../src/c", "../src/h")

一切都正常。scons找到了构建appone应用程序所需的所有源文件和头文件。


但是,如果我尝试以层次结构的方式构建appone,就不行了 :-(

我把app1/SConstruct重命名为app1/SConscript,并在proj/SConstruct里加了:

SConscript('app1/SConscript')

现在我遇到了以下错误:

scons: *** [app1/main.o] Source `app1/main.c' not found, needed by target `app1/main.o'.

我该如何配置我的proj/SConstruct或proj/app1/SConscript,以便在我的Repository目录中搜索所有源文件呢?

1 个回答

0

SCons正在你的app1文件夹里寻找源文件。如果你这样指定源文件:

src=Split("#main.c #first.c #second.c")

那么SCons会在仓库中搜索这些源文件。

这里有几点额外的想法:

  1. 你可能希望main.c放在app1文件夹里,这样可以避免和其他可执行文件的main.c发生冲突。在这种情况下,记得在你的源文件列表中去掉main.c前面的#。

  2. 如果多个应用程序共享仓库,最好在你的顶层SConstruct文件中定义这些仓库。

  3. 从共享源文件中构建库文件通常是有用的,这样单元测试可以有自己的主函数,但又可以链接和你的应用程序相同的源文件(或者让应用程序共享公共模块)。把SConscripts放在共享仓库目录中来构建公共库可能会更简单。这超出了这个问题的范围,但随着项目的发展,值得考虑。

撰写回答