问题标签 [dynamic-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 回答
18134 浏览

linux - 如何找到未满足的 ELF 依赖项?

我使用 LSB SDK 构建了一个测试 ELF 程序(请注意,我的问题并非特定于 LSB):

但我无法启动它(是的,我向你保证文件目录中......):

我认为有一个 ELF 依赖项不满足,但我不知道如何找到它。是否有类似于 ldd 的库工具可用于查找丢失的链接?

我认为这与 2.6.15/2.6.28-15 的差异无关,因为 LSB 编译器正在工作:

以防万一,这里是 a.out 的 ELF 动态部分:

0 投票
2 回答
1913 浏览

visual-c++ - 如何找出是什么让我的应用程序混合了静态和动态链接的 CRT

很抱歉接下来的长篇文章。

我知道混合使用 Microsoft 提供的静态链接和动态链接的 C 和 C++ 运行时并不是一个好主意。不幸的是,我们在工作中的应用程序已经将它们混合在一起,我们一直在努力解决这个问题。由于各种原因(其中不熟悉 MSI,我们使用的 NSIS 可能不能很好地支持 MSM,缺乏时间和资源),我们决定静态链接 CRT 而不是动态链接。我知道这不是一个好主意的原因,但这是我们现在的选择。


我们的代码主要是标准 C++,并辅以大量其他开源库。

应用程序的结构是:产生静态库的各种模块,它们本身链接在一起以创建各种东西,其中一个可执行文件给我们带来了问题。

在 Release 中,我们使用 /MT 构建所有代码。对于一些开源库,我们使用了预编译的二进制文件,其中一些是使用 /MD 预编译的 dll,这使我们混合了运行时。所以我们自己用 /MT 重新编译了它们,并让它们生成静态库而不是 dll。这种转换不是针对每个库都完成的,所以我们仍然链接一些使用 /MD 的 dll。


现在的结果是,在depends.exe 中,除了一个可执行文件之外,我们所有的东西都不直接依赖于msvcr80.dll 或msvcp80.dll。不直接依赖是指msvcr80.dll不是depends.exe 显示的树根的子级。有时我们确实发现 msvcr80.dll 被其中一个库 dll 拉入,但那是树中更深的一些级别。

我如何找出为什么 msvcr80.dll 在那个讨厌的可执行文件的第一级?是什么使该可执行链接直接指向 msvcr80.dll?

一个原因可能是我们静态链接到使用 /MD 链接的库 A,因此它与 CRT 动态链接。所以库 A 中的代码最终在我们的可执行文件中,因此我们的可执行文件与 msvcr80.dll 链接。但是我如何找出哪个库做到了这一点?


到目前为止我尝试了什么:

  • 在depends.exe中加载静态链接的.lib文件->不起作用,因为depends.exe需要可执行文件或dll而不是静态库
  • 在静态链接的 .lib 文件上使用 dumpbin.exe /DIRECTIVES -> 它们都没有显示 msvcrt80.dll (在调试中,我们尝试将 /MDd 用于所有内容,但它们确实显示了 msvcrt80d.dll,这让我认为方法是很好,它证明所有静态链接的开源库都用 /MT 正确编译)
  • 使用 /VERBOSE:LIB 链接器标志 -> 它表明它确实在引入 msvcrt.lib,这是 msvcr80.dll 的导入库,所以我们遇到了麻烦,但它没有说明它为什么这样做
  • 在 Visual Studio 中使用 /VERBOSE 链接器标志 +:附加依赖项 libcmt.lib + 忽略所有默认库 YES + 忽略特定库:msvcrt.lib 拼命尝试让 msvcrt.lib 消失或看看是谁拉了它。结果把我难住了:

据我了解,libcmt.lib 中的 typinfo.obj 引用了一个符号,在 msvcrt.lib 中搜索它,然后在 ti_inst.obj 中找到它会引发一个错误,它被定义了两次。但这没有意义。如果 libcmt.lib 已经有符号,为什么它最终会在 msvcrt.lib 中搜索它并因此将 msvcr80.dll 带入我的可执行文件中?更一般地说,为什么静态库要在动态导入库中搜索符号?如果我在 Ignore 特定库中有链接器,为什么还要查看 msvcrt.lib?

谢谢你的耐心 :-)。

0 投票
1 回答
5893 浏览

linux - Google perftool 无法读取文件“libprofiler.so.0”

我正在尝试使用谷歌性能工具进行 CPU 时间分析。但是,我遇到了一些问题,我无法读取共享库文件“libprofiler.so.0”

我已经阅读了 google performace tool 的 README,手册中有 3 个步骤:

  1. 用 . 编译我的程序-lprofiler。我已经完成了这部分没有任何问题。

  2. 运行我的程序的二进制文件以生成配置文件结果文件。
    这一步我失败了。当我尝试运行我的二进制文件时,出现一条错误消息:
    "error while loading shared libraries: libprofiler.so.0: cannot open shared object file: No such file or directory.".
    我用谷歌搜索,在这个页面上,有人说"libprofiler.so.0"是在"/usr/local/lib",所以我用我的二进制文件将共享库文件复制到目录中,并尝试运行我的二进制文件。它仍然报告相同的错误消息。

我刚刚使用Linux大约一年,如果我的问题很愚蠢,请原谅我。并且,提前谢谢你。

我的机器信息:

  • 操作系统:Ubuntu 8.10
  • 编译器:gcc 4.3.2
  • 外壳:重击
  • google性能工具版本:1.4(我今天才下载的)
0 投票
1 回答
4215 浏览

c - -symbolic 和 -shared GCC 标志之间有什么区别?

从文档的描述来看,它们似乎做同样的事情,除了“并非所有系统”支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统):

-shared 生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。并非所有系统都支持此选项。为了获得可预测的结果,您还必须在指定此选项时指定用于生成代码的同一组选项(-fpic、-fPIC 或模型子选项)。 [1]

-symbolic 在构建共享对象时绑定对全局符号的引用。警告任何未解析的引用(除非被链接编辑器选项 -Xlinker -z -Xlinker defs 覆盖)。只有少数系统支持此选项。

我怀疑区别在于“生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件”部分,但这听起来像是任何库都适用的东西。这是否意味着生成的共享对象也可以静态链接?

0 投票
2 回答
1099 浏览

.net - 如何在 Mono 应用程序中使用 C++ 模块

在 Windows 上开发后,我试图在 Linux 上运行我的 C#/C++ 应用程序。

它的一小部分,FooLib,是用 C++ 编写的,它是从 C# 中调用的以提高性能。FooLib 不使用系统调用,仅使用标准 C++ 功能。它导出一个函数,声明为:

它是用 Visual C++ 编译的。我尝试使用 windows 编译的 FooLib.dll 在单声道下运行应用程序,但 dll 加载(DllImport)失败:

所以我该怎么做?

  • 以某种方式更改出口申报?
  • 在 Linux 上用 gcc 将东西编译成 .so 库,然后加载它?
  • 在 Linux 上使用 gcc 将其交叉编译为 .dll,然后加载它?
  • 还有什么?
0 投票
2 回答
4935 浏览

gcc - 如何通过库名找到库的文件名?

如何通过库名找到库的文件名?

换句话说,当我使用“-lc”时,我知道它是/lib/libc.so.6(或类似的东西)。我希望能够键入一些命令,其中“-lc”是输入,“/lib /libc.so.6" 是输出。为了进一步扩展这个想法,我想指定我自己的搜索路径,这样我就可以将这个库解析器用于不同的工具链......任何帮助都会很棒,

谢谢陈兹

0 投票
2 回答
1219 浏览

mysql - 如何使用 MacPorts 降级动态库?

我的 py-mysql 正在运行,因为我已经升级了 MySQL 替换libmysqlclient_r.15.dyliblibmysqlclient_r.16.dylib. 如何找到并取回旧版本?

编辑:我发现要安装旧版本的 MySQL,我需要做@,但我仍在寻找找到旧版本的方法。

0 投票
2 回答
1417 浏览

dynamic-linking - libtool 如何决定是否构建共享库?

libtool 如何决定是否构建共享库?

陈兹

0 投票
3 回答
210 浏览

c# - 尝试运行没有 dll 的 exe 文件时如何显示错误消息?

我有一个 C# 应用程序,它有一个通过引用添加的 dll。当我尝试从 Windows 运行 exe 文件(编译后)并且 dll 被重命名时,我希望应用程序显示错误消息。

我怎样才能在代码中做到这一点?

0 投票
2 回答
4590 浏览

c++ - 推荐用于跨平台进程内动态库绑定的 C++ 包装器(即轻量级、高性能 COM 或 CORBA)

我们正在开发一个应用程序,该应用程序将具有一个插件“架构”,以允许应用程序的消费者提供他们自己的专有算法。(我们基本上会有一套解析器,并允许第三方也提供他们自己的)

域空间需要非常高的性能,因此进程外绑定不起作用,我们宁愿不理会像 CORBA 和 COM 这样的重量级东西。

基本上,我们正在寻找一个简单的跨平台包装器:

  • 从相对路径加载库
  • 提供特定 dll/.so 到某个配置/名称的映射
  • 进行一些初始化并查询库以确保它提供必要的功能

我认为这实际上只是围绕 loadlibrary() 和导出的方法调用。我们可以自己编写,但我们宁愿使用现有的代码,因为我们的盘子已经足够了。

同样,吞吐量和性能非常重要。

类似的问题是:

COM 的跨平台替代方案- 这个很接近,但我们只需要进程内 - 不需要进程外,我们的需求是“更轻一些”。

C++ 跨平台动态库;Linux 和 Windows

这适用于非托管 C++ - 我们不能使用 .NET

编辑 - 我们发现了什么

我们发现Poco非常适合我们的需求。作为奖励,此页面非常感谢您对 C++ 开发状态和语言方向的评论...

这是 Poco 提供的一个简单的跨平台包装。真的没什么,但仍然节省了我们的时间和测试。在运行时没有额外的开销。