问题标签 [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 投票
1 回答
302 浏览

c++ - 我们应该考虑使用静态链接和动态链接什么?

可能的重复:
静态链接与动态链接
C++ 应用程序 - 我应该为库使用静态链接还是动态链接?

在选择静态和动态链接之前我们应该注意什么?

0 投票
2 回答
3362 浏览

c - 静态库自动发现和链接

我有以下问题,似乎没有很好的解决方案。

例如,我有一个使用 libtiff 和 libX11 的 CLI 实用程序。我想生成这个实用程序的两个版本:动态链接和静态链接(尽可能多地编译依赖)。

对于动态链接,一切都是一种魅力:需要指定-ltiff -lX11和链接器将产生一个很好的可执行引用libtiff.solibX11.so.

静态链接的情况变得更糟。当我使用以下命令时:

它以在 libtiff.a 和 libX11.a 中丢失的符号结尾。好的,我可以将它们依赖的所有库放入行中:

但是有什么工具可以为我做出这个发现吗?libtool可以在这里提供帮助吗(我看到/usr/lib/libtiff.la但没有/usr/lib/libX11.la)?有人可以提供 libtool 的基本示例吗?情况很严重,如果在某些平台上libtiff提供了较窄的功能并且没有链接到libjpeg该平台上根本不可用的功能,那么上述链接命令将由于不满足库依赖关系而失败。

第二个问题是由于该警告(我相信):

该实用程序未与 静态链接libc,它仍显示在ldd输出中。在这种情况下,如何正确地与libX11和静态链接?libc

这个问题是相关的,但我认为重新打包系统.a文件不是一个好主意。

0 投票
2 回答
5547 浏览

c++ - 是否可以在 Mac OSX 10.6 中静态链接 libstdc++?

我正在尝试在其他 Mac OSX 机器上运行我的 C++ 程序,这些机器可能具有较旧的 libstdc++ 副本,但具有所有其他工具。我尝试遵循这种方法,在这个 SO question中也提到过,即使它讨论了 linux 设置。我有小程序try.cpp:

显然,如果我只是编译它,我会得到

我理解对 libSystem.B.dylib 的依赖,我们可以把它放在一边。为了尝试摆脱 libstdc++,我试试这个:

所以,我尝试

或者,

最后,这有效:

这可以吗?(使用 gcc 将 C++ 程序与 libstdc++ 链接)。我在某处听说 g++ 实际上是一个使用 gcc 和 libstdc++ 编译 C++ 程序的脚本。如果是这样,并且我们正确使用它,应该没问题。

但是,我实际上使用的是 macport 编译器和一个更复杂的程序,gcc 会为此生成一些警告,但它与 C++ 兼容。大意是:

这表明我们不应该将 gcc 用于 c++ 编译。所以总结起来,问题是:

  • 如何静态链接 libstdc++
  • 如果 g++ 不这样做,可以使用 gcc 并手动提供 libstdc++ 吗?那么为什么会出现能见度警告呢?
  • 如果由于编译库中的可见性问题,这两种方法都不起作用,那么为什么不使用 libstdc++文件(sstream.h、list.h、vector.c)等并将它们包含在编译中。尽管这会使编译变慢,但它可能对某些应用程序很有用。它甚至可能导致更好的优化!
0 投票
3 回答
9996 浏览

c++ - 我可以将 MSVCRT 与 mingw 静态链接吗?

我有mingw在 Windows 上编译的 C 程序。它工作正常,但需要MSVCRT.DLL. 我想静态链接它(就像我可以在 Visual Studio 中做的那样)。这可能吗?

我尝试-static标记gcc并没有做出任何改变。

使用标准 C++ 库的 C++ 程序呢?

0 投票
2 回答
24254 浏览

gcc - 为什么在 x86_64 上编译静态库时 gcc 不隐式提供 -fPIC 标志

我在编译与静态库静态链接的共享对象时遇到了很多问题。此问题仅出现在 x84_64 平台上。在 x86_32 上进行相同的编译工作时,我没有任何问题。

也许这是特定于操作系统的 GCC 配置,但我的研究表明 GCC 在 x86_64 平台上是如何工作的。无论如何,我在 Ubuntu 10.04 x86_64 上使用 gcc 4.4.3。

问题是如何解决的?...确保所有静态库依赖项都使用 -fPIC 编译。

问题 1: -fpic 和 -fPIC 有什么区别(显然 -fPIC 在 x86 上生成更多指令)?为什么后一种类型在 x86_64 上下文中更相关?

问题 2:我的假设是,当您链接静态代码时,您在链接时将函数硬连接到二进制文件中,为什么它需要“位置无关代码”机制提供的间接级别?

问题 3:现在如果 x86 不需要 -fpic / -fPIC 将共享对象链接到静态档案,为什么 x86_64 需要它?

问题 4:即使需要,为什么不隐式提供?我认为突破性的改变应该是一个很大的禁忌

0 投票
7 回答
508 浏览

c++ - 如何从 C 调用用 C++ 编写的库?

在我看来,这似乎很简单,但我找不到任何反对或支持它的信息。

从拆解等的角度来看,我认为这不是一个大问题,但我不知道如何编写一个小小的 C 程序,它从一个小小的 C++ 库中调用一个函数。

我现在在 linux 上,尝试使用静态绑定。

这一定是很多人都遇到过的事情,或者很多书都涵盖了,但我觉得在这个问题面前就像一个盲人。有趣的是,在 SO 上也没有这样的问题。

我什至不知道这是否可行,更不用说如何完成了。

0 投票
1 回答
3858 浏览

c++ - 如何将 Windows 上的 SDL 与 MinGW 静态链接?

见标题。我正在使用代码::块。谷歌搜索结果涉及 sdl-config sh 脚本的信息,我显然不能在 Windows 上使用。

0 投票
1 回答
1068 浏览

g++ - 无法使用 TclPro1.4 创建自定义 TCL 解释器:未定义对 `__ctype_b' 的引用

我正在尝试根据TclPro 用户指南第 7 章中的说明使用 TclPro 创建自定义 TCL 解释器,但它失败并出现链接错误undefined reference to __ctype_b

我已经下载并安装了 TclPro 1.4 /opt/ajuba/TclPro1.4/,这是我要构建的自定义解释器:

Pro_WrapTclMain所以它除了调用standard之外什么都不做Tcl_Init

我正在尝试simple.cpp使用以下命令进行构建:

这是我收到的第一条错误消息(您可以在底部找到完整的日志):

似乎__ctype_b是 TclPro 期望在 libc.a 中定义的符号,但是

所以在 libc.a 中没有定义 __ctype_b。

问题是:在这种情况下如何用 TclPro 构建一个自定义的 TCL 解释器?

如果__ctype_b 应该定义在libc.a,那我怎样才能得到一个合适的libc.a呢?

这是编译的完整日志:

0 投票
1 回答
416 浏览

c++ - 链接错误:模板化友元运算符重载

我有一个奇怪的链接错误。我按照此处提供的说明来避免此类问题,但我不知道如何拆分标头和实现文件。

这是我的测试文件:

class cargo包含在测试中的头文件:

及其实现:

我正在使用 CMake 编译并将它们链接在一起。我得到的链接错误是关于未定义的引用operator <<

我究竟做错了什么?请帮我!

0 投票
1 回答
1840 浏览

qt - Qt + Google Protocol Buffers,链接库问题

希望这是一个简单的问题:

我正在使用 Qt 构建一个应用程序,并希望使用 Google 的协议缓冲区。我已经下载并安装了 protobuf 源,现在我想在我的项目中链接它。

我的.pro文件包含以下行:

但是,我收到错误:

尝试编译时。

我假设我在做一些相当基本的错误。谢谢你的帮助!