问题标签 [static-linking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1366 浏览

c - 除了“常见”部分之外,我如何对其他部分的符号进行排序?

gnu 链接器“ld”提供选项“-sort-common”,它按大小对未初始化的全局参数(称为 COMMON 节符号)进行排序。当链接器将符号对齐到偶数地址时,此选项有助于最大限度地减少节中的孔。例如,如果我们定义:

--main.c

字符一个;

短 b;

字符 c;

int main() { 返回 0; }

并在没有“sort-common”的情况下将其编译为 main.o,我们将在“a”的地址和“b”的地址之间得到一个字节的“洞”。如果我们使用“sort-common”,链接器会将参数重新排序为“a, c, b”,并且由于 a 的大小为 1 字节,c 的大小为 1 字节,因此它们的地址之间不会有“空洞”。我的问题是我的代码看起来像:

--main.c

字符 a = 0;

短 b = 0;

字符 c = 0;

...

在这种情况下,a、b 和 c 在 BSS 部分中,这意味着“sort-common”不会影响它们。

除了“常见”部分之外,我如何对其他部分的符号进行排序?

我还在 LD 脚本中搜索了许多选项,但均未成功。

更新:我在 segment_flags 中读到了一些关于“Order”值的内容,但不明白如何使用它。任何帮助都是可观的。

0 投票
16 回答
279423 浏览

c++ - 静态链接与动态链接

在某些情况下,是否有任何令人信服的性能理由来选择静态链接而不是动态链接,反之亦然?我听过或读过以下内容,但我对这个主题的了解还不够,无法保证其真实性。

1) 静态链接和动态链接在运行时性能上的差异通常可以忽略不计。

2) (1) 如果使用使用配置文件数据优化程序热路径的分析编译器则不正确,因为通过静态链接,编译器可以同时优化您的代码和库代码。使用动态链接只能优化您的代码。如果大部分时间都花在运行库代码上,这会产生很大的不同。否则,(1) 仍然适用。

0 投票
4 回答
5041 浏览

c++ - C++ 应用程序 - 我应该为库使用静态链接还是动态链接?

我将开始一个新的 C++ 项目,该项目将依赖于一系列库,包括 Boost 库、log4cxx 或 google 日志库的一部分——并且随着项目的发展,其他项目也会发展(我还不能预料到) .

它必须在 32 位和 64 位系统上运行,很可能在一个非常多样化的 Linux 环境中,我不希望拥有所有必需的库或 su 权限。

我的问题是,我应该通过动态或静态链接到所有这些库来构建我的应用程序吗?

笔记:

(1) 我知道静态链接在开发过程中可能会很痛苦(更长的编译时间、32 位和 64 位的交叉编译、向下依赖链以包含所有库等),但在测试期间要容易得多 -只需移动文件并运行。

(2) 另一方面,动态链接接缝在开发阶段更容易 - 编译时间短,(真的不知道如何处理从我的 32 位开发环境到 64 位库的动态链接),没有依赖链的喧嚣。另一方面,新版本的部署可能很难看——尤其是在需要新库时(请参阅上面的条件,即在目标机器上没有 su 权限,也没有这些库可用)。

(3) 我已经阅读了有关该主题的相关问题,但无法真正弄清楚哪种方法最适合我的情况。

结论:

  1. 谢谢大家的意见!
  2. 我可能会使用静态链接,因为:
    • 更容易部署
    • 在 perf 期间可预测的性能和更一致的结果。测试(看这篇论文:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • 正如所指出的,静态与动态编译的大小和持续时间似乎并没有那么大的差异
    • 更容易和更快的测试周期
    • 我可以保留所有开发人员。在我的开发中循环。机器
0 投票
2 回答
1034 浏览

linker - How to build MTd projects which use MDd dlls in VS2005

I am building my application in Visual Studio 2005, using project properties ->c/c++->CodeGeneration->RuntimeLib: MTd (using static CRT library-LIBCMTD). The application is using 3rd party dlls and libs which are built in MDd(using dynamic CRT lib- MSVCRTD).

I'm getting linker errors as: MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mktime64 already defined in LIBCMTD.lib(mktime64.obj) MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __gmtime64 already defined in LIBCMTD.lib(gmtime64.obj) MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __localtime64 already defined in LIBCMTD.lib(loctim64.obj)

I cannot change the 3rd party settings. My application runs fine if I use the CRT lib dynamically, but I cannot change this.

Thanks

0 投票
2 回答
3097 浏览

c - 静态链接到 lib 并且仍然请求 DLL

使用 Visual Studio 2008,我有.H一个.LIB库文件。我编写了一个程序并通过项目属性引用了 LIB。它编译得很好,但是当它运行时,它会要求安装 DLL。如果 DLL 与它的工作原理在同一个目录中,EXE但是,如果我有LIB,这是否已经意味着函数静态链接到我的程序?

0 投票
6 回答
12821 浏览

static - SCons 使用静态库 (.a) 创建共享库 (.so)

我正在尝试让 SCons 创建一个共享库。进入的项目之一.so.a静态库。

我有这样的一行:

在运行它时,我收到此错误:

但是,我知道可以.a通过以下命令创建共享库:

任何关于让它工作的想法或任何解决方法都将不胜感激。


相关问题:如何让 scons-shared在 LINK 命令行上为Program()调用添加一个附加字符串?如果我能做到这一点,我认为它会满足我的需求。

0 投票
3 回答
12012 浏览

linux - 尝试静态链接 Boost

我正在使用 Boost 库在 Linux、Eclipse CDT、g++ 中工作。拥有使用 Boost 线程的现有程序,我尝试静态链接它而不是动态链接。/usr/local/lib 目录包含以下文件:

动态链接工作:

静态链接:

产生大量消息,例如:

对“pthread_mutex_init”的未定义引用

如何静态链接到 Boost 库?

0 投票
2 回答
1632 浏览

gcc - 静态链接 libstdc++ 和链接 libstdc++.a 有什么区别

全部。在问这个问题之前,我已经阅读了这篇文章:静态链接 libstdc++

我只是无法理解他对为什么静态链接根本不起作用的解释。这里有人可以帮我吗?(由于原来的博客反馈已关闭,我忍不住在这里问)

0 投票
1 回答
109 浏览

c++ - OS X 上的哪些动态库可以被视为理所当然?

如果我想让一个 OS X 程序尽可能独立以简化安装,我希望每个人或大多数人都拥有哪些动态库?如果我知道这一点,我就不必为所有东西编译静态库。

0 投票
4 回答
3944 浏览

linux - 静态链接库的优缺点是什么?

我想发布一个我为 Linux 和 Windows 作为爱好而开发的应用程序。此应用程序依赖于 boost(可能还有其他库)。这种应用程序(国际象棋引擎)的标准是只提供一个可执行文件和可能的一些帮助文件。

我认为静态链接库是个好主意,这样可执行文件就不会有任何依赖关系。所以最终用户可以将可执行文件放在一个目录中并开始使用它。

然而,在网上做一些研究时,我发现了一些关于静态链接库的负面评论,有些人甚至认为具有静态链接库的应用程序很难移植,这意味着它只能在我的高度相似的系统上运行。

那么静态链接库的优缺点是什么?

我已经知道可执行文件会更大。但我不明白为什么它会降低我的应用程序的可移植性。