如何在 scons 中添加 --whole-archive 链接器选项?

2024-02-21

我有一个仅在静态范围内与应用程序交互的库。这需要我将库与--whole-archive选项以避免链接器“优化”库(这样做是因为链接器实际上从未看到我的库正在被使用)。

问题是我还没有找到为 scons 中的特定库添加此链接器选项的方法。

env.Append(LIBS=['mylib']) #I don't have the linker option
env.Append(LINKFLAGS=['-Wl,--whole-archive','-lmylib']) #I don't add myself to the scons dependency tree, I also get added to the link line before the LIBPATH variable.

如何在 scons 中优雅地支持链接器标志?


改写的问题:

如何使用 --whole-archive 链接标志和 scons 将静态库链接到共享库,同时维护依赖关系。

我重申你的问题只是为了确保我们都清楚地了解你想要完成的任务。如果我没有正确理解您问题的意图,请发表评论。

为什么它不适合你:

您不能将库包含在LIBS,因为你想用--whole-archive旗帜。如果您将此条目放入LINKFLAGS它可以工作,但你会失去依赖跟踪。

Answer:

当您将库从某个条目移动到LIBS到一个条目LINKFLAGS你失去了implicit依赖关系,但是没关系,只需设置一个explicit依赖于Depends.

工作示例:

文件布局

.
├── A.cpp
├── A.h
├── B.cpp
├── B.h
├── main.cpp
└── SConstruct

Files

A.cpp

#include "A.h"

int foo2(void) {
    return 2;
}

A.h

#ifndef __A__
#define __A__
int foo2(void);
#endif

B.cpp

#include "B.h"
#include "A.h"

int bar(void) {
    return 2 * foo2();
}

B.h

#ifndef __B__
#define __B__
int bar(void);
#endif

main.cpp

#include <iostream>
#include "B.h"

using namespace std;

int main() {

    cout << "Sum of foo and bar = " << bar() << endl;
    return 0;
}

构建

import os

# Top level Build Environment
env = Environment()

# Library A
envA = env.Clone()
libA = envA.StaticLibrary('A.cpp')

# Library B
envB = env.Clone()
envB.Append(LINKFLAGS=['-Wl,--whole-archive,./libA.a,--no-whole-archive'])
libB = envB.SharedLibrary('B.cpp')
Depends(libB, libA)

# Test Program
envE = env.Clone()
envE.Append(LIBS=['B'],
            LIBPATH=['.'],
            RPATH=[os.path.abspath(os.curdir)])
envE.Program('example', 'main.cpp')

To Run:

将所有文件复制到同一目录,然后输入scons在该目录中。如果您构建并请求依赖关系树,这是您应该在 Linux 上看到的输出。 (我使用的是 Fedora 21)

>> scons --version
SCons by Steven Knight et al.:
    script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation

>> scons --tree=prune
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o A.o -c A.cpp
g++ -o B.os -c -fPIC B.cpp
g++ -o main.o -c main.cpp
ar rc libA.a A.o
ranlib libA.a
g++ -o libB.so -Wl,--whole-archive,./libA.a,--no-whole-archive -shared B.os
g++ -o example -Wl,-rpath=/full/path/to/build/directory main.o -L. -lB
+-.
  +-A.cpp
  +-A.h
  +-A.o
  | +-A.cpp
  | +-A.h
  | +-/bin/g++
  +-B.cpp
  +-B.h
  +-B.os
  | +-B.cpp
  | +-A.h
  | +-B.h
  | +-/bin/g++
  +-SConstruct
  +-example
  | +-main.o
  | | +-main.cpp
  | | +-B.h
  | | +-/bin/g++
  | +-/bin/g++
  | +-libB.so
  |   +-[B.os]
  |   +-libA.a
  |     +-[A.o]
  |     +-/bin/ar
  |     +-/bin/ranlib
  +-[libA.a]
  +-[libB.so]
  +-main.cpp
  +-[main.o]
scons: done building targets.

>> ./example
Sum of foo and bar = 4

该示例的作用:

  • 构建静态库A。
  • 构建动态库B--whole-archive库 A 上的链接标志。
  • 构建一个链接到库 B 的可执行文件,并执行库 B 中使用库 A 中函数的函数。
  • 正确跟踪目标之间的依赖关系。

结论:

从上面的依赖关系图中可以看到,库 A 已正确列为库 B 的依赖项。

Enjoy!

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

如何在 scons 中添加 --whole-archive 链接器选项? 的相关文章

随机推荐

  • Swift 中的纯类协议

    我希望我的一些课程 不是全部 符合使用 仅限类的协议 https developer apple com library ios documentation Swift Conceptual Swift Programming Langua
  • 使用 MS Access 中的 GUID pk 插入 SQL Server 表

    我正在将数据库从 Access 后端迁移到 SQL Server 后端 同时保留 Access 前端 其中一张表设置了其 PK 的复制 ID 作为 Access DB 我们可以将值插入到该表中 而无需引用 PK 字段 因为 Access 会
  • 使用 jquery 选择最近的锚元素

    我有一张带有一个链接的表 如下所示 td a href class topiclink item Topic a td 我想选择 item topic的数据 我尝试使用 topiclink click function e var val
  • CoreData 无法完成以下错误:

    我有一个非常烦人的问题 我似乎无法解决 当我发送一条消息并保存到核心数据时 我有一个视图 完成后它会向数据库询问随机消息 句子 并将其保存到数据库中的另一行 如果我对最后一部分进行硬编码 而不从数据库中获取数据 那么它工作得很好 但是一旦我
  • 如何让 FTP-Simple 在 Visual Studio Code 中工作?

    我最近选择开始使用 Visual Studio Code 我想连接到远程服务器并直接在服务器上编辑文件 FTP Simple 似乎是一个很好的解决方案 但我很难理解该程序的一些基础知识 如果我连接到服务器 FTP Simple 是否会下载a
  • Service Worker 和 AppCache 的比较

    Service Worker 和 AppCache 之间的核心区别是什么 每种方法的优点和缺点是什么 何时更喜欢其中一种 主要区别在于 AppCache 是一个高级声明式 API 您可以使用它指定希望浏览器缓存的资源集 而 Service
  • 使用 Shibboleth 和 Google App Engine java 实现 SSO

    我正在开发一个应用程序谷歌应用引擎在Java中 在这个应用程序中我必须实现SSO using SAML2 我的谷歌应用程序引擎应用程序将充当服务提供商 而身份提供商将是一个单独的服务器 我只需编写 SSO 的 SP 端 我是 SAML 新手
  • 分离使用 python 多处理模块启动的子进程

    我想使用 python 中的 mutliprocessing 模块创建一个进程 但确保它在创建子进程的进程退出后继续运行 我可以使用 subprocess 模块和 Popen 获得所需的功能 但我想将代码作为函数而不是脚本运行 我想这样做的
  • 如何在 Mac 上更改 R 版本

    我正在尝试使用旧版本的 R 在 Mac 上运行包 在 Windows 上 常规 选项卡中有一个开关 但是 在 Mac RStudio 上找不到它 我参考了这个帖子 https support rstudio com hc en us art
  • 使用 gson 反序列化内部类返回 null

    我想使用 Gson 将 JSON 反序列化为对象 我已经定义了适当的类 其中一些类的对象包含在其他对象中 当尝试反序列化整个 JSON 时 我得到了空值 因此我开始将其分解 我达到了所有较低类都站在自己一边的地步 但是当尝试反序列化为包含该
  • 从 UserAgent 字符串创建 HttpBrowserCapabilityBase

    So the Http请求库 http msdn microsoft com en us library system web httprequestbase aspx类有一个浏览器属性 http msdn microsoft com en
  • Azure Devops - 更新 json 文件 - powershell 脚本

    我创建了 powershell 脚本来使用变量更新 json 文件 Json 文件位于 Azure Devops 存储库中 json 文件名为 var json 我将在 azure devops 中使用此解决方案 因此我构建了管道并在 az
  • WebGet 在功能上等同于 WebInvoke(Method = "GET") 吗?

    This https stackoverflow com questions 1072556 wcf webgetattribute vs webinvokeattribute问题已经问了我要问的问题 但我想对答案进行一些澄清 答案指出We
  • java中如何将列表数据转换为json

    我有一个函数将数据返回为List在java类中 现在根据我的需要 我必须将其转换为Json Format 下面是我的函数代码片段 public static List
  • 计算另一个计数结果出现的次数

    我们有一张表叫做entries它根据日期存储用户信息 用户每天只能进入数据库一次 一些示例数据 id email date 1 email protected cdn cgi l email protection 04 09 13 2 em
  • Zend Framework 中的国家、省份、城市、产品路由

    这个url结构是为了SEO优化而提出的 所以建议另一种结构是行不通的 提议的结构是 example com
  • 通过正则表达式对传入进行分类引起:Application_NewMail:字节值不匹配

    我正在使用 Outlook 2010 的 VBA 宏来过滤传入的电子邮件并将其分类到不同的文件夹中 该规则在目标中提到 在实现和测试时 它确实提示错误消息框 而不是成功过滤 请告诉我默认呼叫下的哪个部分Application NewMail
  • 类似 Google 的搜索查询标记化和字符串分割

    我正在寻找类似于谷歌的做法来标记搜索查询 例如 如果我有以下搜索查询 the quick brown fox jumps over the lazy dog 我想要一个包含以下标记的字符串数组 the quick brown fox jum
  • 根据列中的共同值将大型数据框拆分为数据框列表

    我有一个包含 10 列的数据框 收集 用户 的操作 其中一列包含一个 ID 不是唯一的 标识用户 第 10 列 数据帧的长度约为750000行 我正在尝试提取由包含 用户 标识符的列分割的各个数据帧 因此获取数据帧的列表或向量 以隔离单个参
  • 如何在 scons 中添加 --whole-archive 链接器选项?

    我有一个仅在静态范围内与应用程序交互的库 这需要我将库与 whole archive选项以避免链接器 优化 库 这样做是因为链接器实际上从未看到我的库正在被使用 问题是我还没有找到为 scons 中的特定库添加此链接器选项的方法 env A