SCons 库和子库

2024-03-23

我有一个基于 SCons 的分层构建系统。我有一个根 SConstruct,它调用一个构建共享库的 SConscript,然后调用另一个构建依赖于共享库的可执行文件的 SConscript。

所以这是我的问题:我对linux上共享库的理解是,当你想做最后的事情时ld将使用共享库的可执行文件的链接,共享库必须包含在可执行文件的ld命令行作为引用它的源(除非它位于标准位置,在这种情况下-l选项有效)。

我的 SCons 文件如下所示:

=== rootdir/SConstruct

env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env.Append( LIBS=[shared_lib] )
executable = SConscript('barexec/SConscript')

=== rootdir/foolib/SConscript

env=DefaultEnvironment()
env.Append(CPPPATH=Glob('inc'))
penv = env.Clone()
penv.Append(CPPPATH=Glob('internal/inc'))
lib = penv.SharedLibrary( 'foo', source=['foo.c', 'morefoo.c']
Return("lib")

=== rootdir/barexec/SConscript

env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] )
Return("exe")

所以这里的问题是这一行:

env.Append( LIBS=[shared_lib] )

这将是一个将生成的库添加到命令行以供任何其他需要它们的库的好方法,除了因为 SCons 正在通过 SConscripts 进行两遍运行(首先生成它的依赖关系树,然后完成工作) ,rootdir/foolib/libfoo.so最终出现在所有产品的命令行上,甚至libfoo.so itself:

gcc -g -Wall -Werror -o libfoo.so foo.o morefoo.o libfoo.so

那么如何使用 SCons 最好地实现这一点呢?现在我已经采用了这个技巧:

=== rootdir/SConstruct

env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env['shared_lib'] = shared_lib
executable = SConscript('barexec/SConscript')

...

=== rootdir/barexec/SConscript

env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] + env['shared_lib'] )
Return("exe")

有没有更 SCons 的方式来做到这一点?


您应该允许构建找到共享库。

寻找LIBPATH and RPATH中的变量SCons文档;这些是设置搜索路径的“Scons-y”方式,以便任何生成的-l选项可以正确找到库。

说了上面这些,这就是你要说的should see gcc根据 SCons 的设置执行(如果没有,您可能需要手动执行)。

The -l选项始终会查找共享库,前提是您还向编译器提供了库的位置。有两次需要这样做:在编译时(-L选项)和运行时(-rpath生成的链接器选项)。

The LIBPATHSCons 设置应该生成如下所示的内容-L/some/directory/path编译时搜索路径。

The RPATHSCons 设置应该生成一个链接器选项embed搜索路径;例如-Wl,-rpath -Wl,\$ORIGIN/../lib将嵌入一个相对于可执行文件进行搜索的搜索路径,以便将可执行文件放置在bin并行搜索lib安装目录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SCons 库和子库 的相关文章

随机推荐

  • jquery 和 updatepanel?

    我在 ASP NET 中有一个更新面板 可以进行部分页面刷新 我使用 jQuery 取得了一些成功on 方法不过 document ready function 仅在页面初始加载期间调用 而不是在每次 updatepanel 刷新后调用 我
  • 如何在 C++ 调试期间冻结 VSCode 中的线程

    我已经使用 VSCode 进行编码几个月了 真的是太棒了 然而 我发现我无法冻结一个线程 我能做的就是Pause all threads and Continue all threads 如果不冻结特定线程 则很难调试多线程程序 尤其是一些
  • 为什么 v1 Web 组件 customElements.define() 会抛出 TypeError

    我正在使用 v1 Web 组件 根据埃里克 比德尔曼 Eric Bidelman 的说法自定义元素 v1 可重用的 Web 组件 https developers google com web fundamentals primers cu
  • 将常规 Swift 函数转换为 Curry 函数

    我正在尝试将常规函数转换为咖喱函数 但得到Execution was interrupted 下面是我柯里化一个函数并执行 unsafeBitCast 来调用带有一个参数的函数并稍后使用第二个参数调用它的代码 func curry
  • 当“状态”从“打开”更改为“已完成”时,如何将一行移动到工作表(GOOGLE SHEET)的底部

    当 状态 更改为完整时 如何将行移动到同一张纸的底部 我试图找出一旦 Status B 列值从 OPEN 更改为 CLOSED 时如何将行移动到底部 工作表名称为 Sheet1 其中状态下拉菜单位于 B 列 下拉菜单包含 OPEN HOLD
  • libv4l2:打开流时出错:设备上没有剩余空间

    我尝试为 opencv 获取立体声对 我将 Logitech B910 和 Logitech C910 网络摄像头连接到 USB 但有这个错误 我玩弄了怪癖参数并设置outfmt mjpeg在mplayer中 但又出现此错误 在哪里可以找到
  • theano 给出“...正在等待未知进程的现有锁...”

    我的代码运行良好 但是 现在我收到一条错误消息 Using gpu device 0 GeForce GT 750M WARNING theano gof cmodule ModuleCache refresh Found key with
  • Python Pandas 混合布尔 Yes/True 和 NaN 列

    我正在学习健康科学课程 推荐使用 R 或 Stata 我正在尝试使用 Python Numpy Pandas 来代替 因为我希望将来使用它来进行金融时间序列分析 数据是 Stata 格式 所以我复制了字段并将它们保存为CSV 所有字段导入都
  • R Shiny - 多页可编辑数据表在编辑后跳转到第 1 行

    我正在使用 R 3 3 1 Shiny v 1 2 0 和 v DT 0 5 开发一个 Shiny 应用程序 其中一个元素是跨多个页面的可编辑数据表 在我进行编辑后 焦点行会跳转到第 1 行 这会破坏用户体验 以下是使用下面的代码片段重现此
  • 使用 Chrome 将 HTML 填充到 about: URL 中

    以前 在 Internet Explorer 中 您可以在 URL 栏中输入以下内容 about 屏幕会变成红色 Chrome 中是否有等效的 heredoc 语法用于通过 URL 加载 HTML 也许是数据 URI data text h
  • 在 Docker Compose 中执行 /bin/bash

    我正在尝试自动化 docker compose 文件 我想做一些初步任务 例如更新源代码 构建库并自动运行bash只需调用容器上的终端即可docker compose up 有没有办法做到这一点 我尝试执行以下操作 version 3 3
  • KSQL - 删除主题

    有没有办法从 KSQL 中删除该主题 根据github https github com confluentinc ksql blob 4 0 x ksql engine src main java io confluent ksql dd
  • 为什么我无法在 Flutter ModalBottomSheet 中滚动自定义 WebView

    大家好 有人知道为什么我无法在 ModalBottomSheet 中垂直滚动 WebView 吗 这是我的代码 如果有任何问题请告诉我或给我一些建议 showModalBottomSheet context context isScroll
  • 在 Fabric 中作为 sudo 执行

    我有一个命令service app start demo需要我输入sudo service app start demo在命令行中 I used sudo service app start demo and sudo sudo servi
  • Flutter setState 改变,但不重新渲染

    我创建了一个简单的屏幕 它接受字母列表并将它们呈现在网格中 我有一个带有随机播放方法的按钮 可以随机播放此列表 在我的构建方法中 我看到状态正在使用新列表进行更新 并且每次按下按钮时都会打印出一个随机列表 但屏幕不会改变 class Let
  • 有没有一种方法可以在不添加 throws 声明的情况下抛出异常?

    我有以下情况 我有一个 Java 类 它继承自另一个基类并重写一个方法 基本方法不会抛出异常 因此没有throws 宣言 现在我自己的方法应该能够抛出异常 但我可以选择 吞掉异常或 添加抛出声明 两者都不令人满意 因为第一个会默默地忽略异常
  • Microsoft Edge,媒体查询无法正常工作

    我在 Google Chrome 上成功测试了此媒体查询 但不知何故 Microsoft Edge 存在问题 这些查询有问题吗 或者这只是 Microsoft Edge 中的一个错误 UPDATE 看起来 Edge 需要一个没有媒体查询的类
  • 查找背包中的物品

    我想用C 递归地解决背包问题 这是我的代码 public int f int n int remain if n lt 0 return 0 if w n gt remain Thread VolatileWrite ref check n
  • as3crypto 的 sha1 哈希值与 PHP 生成的哈希值不同

    使用 as3 中的 as3crypto 从字符串 12345 生成 SHA1 哈希 与示例中的操作方式相同 var sha1 SHA1 new SHA1 var src ByteArray Hex toArray 12345 var dig
  • SCons 库和子库

    我有一个基于 SCons 的分层构建系统 我有一个根 SConstruct 它调用一个构建共享库的 SConscript 然后调用另一个构建依赖于共享库的可执行文件的 SConscript 所以这是我的问题 我对linux上共享库的理解是