- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 scons 构建一个模块化系统来编译多个共享库,其中一些共享库依赖于其他共享库。虽然我可以使用一些不同的变通办法来编译它,但每个变通办法都有一些缺点,如“尝试的解决方案”部分所述。
.
├── SConstruct
└── src
├── libA
│ ├── a.cc
│ ├── a.hh
│ └── SConscript
├── libB
│ ├── b.cc
│ ├── b.hh
│ └── SConscript
└── SConscript
这里,b.cc
包含了a.hh
,这是两个库之间的依赖关系。
每个文件的内容如下所示。
# In SConstruct
VariantDir('build', 'src', duplicate=False)
SConscript('build/SConscript')
# In src/SConscript
env = Environment()
SConscript(['libA/SConscript', 'libB/SConscript'],
exports='env')
# In src/libA/SConscript
Import('env')
env.Append(CPPPATH=['.'])
env.SharedLibrary('a.cc')
# In src/libB/SConscript
Import('env')
env.Append(CPPPATH=['.'])
env.SharedLibrary('b.cc')
在这里,我遇到了一个问题。当我运行 scons 时,我得到以下结果。
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/libA/a.os -c -fPIC -Ibuild/libA -Isrc/libA -Ibuild/libA -Isrc/libA src/libA/a.cc
g++ -o build/libA/liba.so -shared build/libA/a.os
g++ -o build/libB/b.os -c -fPIC -Ibuild/libB -Isrc/libB -Ibuild/libB -Isrc/libB src/libB/b.cc
src/libB/b.cc:3:16: fatal error: a.hh: No such file or directory
#include "a.hh"
^
compilation terminated.
scons: *** [build/libB/b.os] Error 1
scons: building terminated because of errors.
我从this older question知道-Ibuild/libA
和 -Isrc/libA
的重复是有意义的,并且是有意的。但是-Isrc/libA
在编译a.cc
时被传递了两次,在编译b.cc
时根本没有传递。
这似乎是由于将字符串传递到 CPPPATH
而不是 Dir()
节点引起的。该字符串稍后会使用当前 SConscript 的路径进行扩展,而不是使用当前 SConscript 进行扩展。为了避免这种情况,我在 src/libA/SConscript
中将 CPPPATH=['.']
修改为 CPPPATH=[Dir('.')]
> 和 src/libB/SConscript
。这不起作用,因为只有 build/libA
包含在 CPPPATH 中,而不是 src/libA
,如下所示。
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/libA/a.os -c -fPIC -Ibuild/libA -Ibuild/libB src/libA/a.cc
g++ -o build/libA/liba.so -shared build/libA/a.os
g++ -o build/libB/b.os -c -fPIC -Ibuild/libA -Ibuild/libB src/libB/b.cc
src/libB/b.cc:3:16: fatal error: a.hh: No such file or directory
#include "a.hh"
^
compilation terminated.
scons: *** [build/libB/b.os] Error 1
scons: building terminated because of errors.
其次,我使用 duplicate=False
对此进行了测试。结合第一个测试,使用 Dir('.')
,这成功编译了库。然而,这并不理想,因为任何调试符号都会指向 build
目录中的源文件。对于大型项目,编译后,我喜欢删除 build
目录以节省空间,这会使调试变得更加困难,因为 gdb 无法再找到源文件。
接下来,我尝试使用绝对路径。也就是说,在 libA 中,我添加了 CPPPATH=['#/src/libA']
,在 libB 中,我添加了 CPPPATH=['#/src/libB']
。编译成功,duplicate=False
。但是,这旨在作为一个库,可能包含在许多不同的顶级 SConstructs 中。通过将路径硬编码到库的 SConscript 中,它限制了该库的使用。
最后,我尝试完全不使用 VariantDir
。除了使用 Dir('.')
作为每个库的路径之外,这还有效,但会将所有中间文件留在 src
目录中。这会弄乱目录结构,并使维护多个构建(例如调试/发布)变得非常棘手。
是否有可以避免这些问题的设计用法?
最佳答案
您声明“通过将路径硬编码到库的 SConscript 中,它限制了该库的使用。”。但是有什么选择呢?在您的构建描述中的某个时刻,您必须具体说明应搜索哪些路径以查找隐式依赖项(如 header 或库)。如果您随后移动文件夹,构建将会中断...与您选择的构建工具无关。
使用从顶级 SConstruct 开始指定的 SCons“#”路径,效果很好,是您问题的一种解决方案。另一种选择是使用相对路径,从您当前的 SConstruct 向上或向下开始。所以对于 src/libB/SConscript
你可以使用:
Import('env')
env.AppendUnique(CPPPATH=['.', '../libA'])
env.SharedLibrary('b.cc')
这样至少可以让您将“libA
”和“libB
”同时移动到一个新位置。但我不认为你能做得比这更好......
关于c++ - scons、CPPPATH 和多个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40424482/
我正在为 scons 扩展一个命令,但来源不完整。一些 xml pdf 文档不存在。 根据 scons wiki,我可以使用scons -i (--ignore-errors,忽略为重建文件而执行的命
在构建我的程序时,区分不存在的文件和空文件很重要。但是,scons 似乎对它们一视同仁,并且在源文件从这些状态之一更改为另一种状态时忽略了重建目标。 逐步示例: 第 0 步: 构造 foo = Com
我正在使用 scons 构建两个项目。一个效果很好,而另一个(更复杂的)项目非常令人沮丧。这是我在为第二个项目运行 scons 时看到的: S time scons scons: Reading SC
我最近从 make 转换为 SCons。我通常在 make 中做的一件事是有一个从源文件生成预处理源的方法,其中包含将应用于正常构建的所有编译器选项。这对于确定 header 的包含方式很有用。 在
我有一个使用 scons 构建的大型 C++ 项目。 它的构建速度很慢,我想进行一些更改以使其构建速度更快。 现在我想集中我的时间来加速构建中最慢的部分。 如何确定哪些文件需要最长的编译时间? 最佳答
我想对所有 .o 做一些后期处理文件(例如由 Object 或 StaticObject Builders 生成的文件),无论用户使用什么 Builder。 我试图像这样“覆盖”或“ Hook ”基础
更新作为构建一部分的文件内容的正确 SCONS 方法是什么? 我使用 SCONS 来构建一个相当大的项目。但是为了一个简单的问题,假设它看起来像这样: env.Program("foo", ["foo
我不想使用 scons --n,我想看看某些东西是如何构建的,而不是现在如何构建。 我认为它可以以某种方式使用 .sconsdblite。 有人做过吗? 最佳答案 SCons man pages解释了
我正在尝试让 SCons 检查我需要的 git 存储库(并希望使该存储库保持最新状态)。问题是我必须告诉它 git repo 包含哪些文件才能在构建中使用它们,如果我这样做,SCons 将在尝试克隆它
我需要作为自定义构建器的一部分按顺序运行两个程序。 其中一个程序我被困住了,无法处理绝对/相对路径,因此我必须使用构建器的 chdir=1 选项才能运行其操作与目标位于同一目录中。 第二个是位于项目的
我正在尝试建立一个涉及代码生成器的构建系统。在生成器运行之前,生成的确切文件是未知的,但我希望能够通过模式匹配运行进一步的构建步骤(在具有某些扩展名的所有文件上运行一些程序)。这可能吗? 这里涉及代码
我有一个简单的项目构建系统,我使用SCons将其组合在一起。 。该项目有相当多的源文件,我认为在构建过程中显示某种进度信息将是用户友好的。 SCons 提供了诸如 CXXCOMSTR 之类的构造变量,
我正在为不同的编译器使用 scons。vc10 和瑞萨编译器。如果我使用 env.program(---) 编译程序,我得到的链接标志为 “链接/nologo/subsystem:console/pd
我有一个分层构建,它使用 SConscript 递归地声明构建目标;所以我事先不知道目标。每个构建都会产生一些额外的文件,比如 *.err *.out ,这些文件不在目标中。当我运行 scons -c
我正在使用 scons 来构建一个项目。效果很好。但是我们的构建命令只是将结果输出到标准输出,我需要让它对我们的软件团队更有用一点。 以下是我想要的行为,按优先顺序排列。有人可以帮我实现它们吗? 没有
我的团队正在创建一个基于 SCons 的构建系统。我们在自己的 site_scons/site_tools 文件夹中创建了一堆辅助类。 我的任务是使用 pyunit 在我们的代码上创建和运行测试。测试
我有一个自定义构建器如下 my_builder = Builder(action = ['mytool' + env['TESTFLAG'] + ' $SOURCE -o $TARGET')],
我有一个仅包含头文件的库,其中包含一个文件夹层次结构和一堆 .hpp我想安装的文件。我的问题是,该 scons 不会将该文件夹复制到构建文件夹中。 这是我的目录布局的样子: root SConst
我正在使用 scons 为一个较大的软件项目实现构建系统。有一个目录结构将各个库和程序的代码分离到它们自己的目录中。使用我们现有的 make 系统,我可以在单个程序目录中执行“make clean”,
默认情况下,SCons 似乎会查看用于构建程序的“配方”并从中提取隐式依赖项。例如假设我的 SConstruct 包含: Command('foo', 'foocreator.py', '/usr/b
我是一名优秀的程序员,十分优秀!