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

c++ - 动态链接 DLL 需要与其调用者共享一个全局变量

我有一个静态库libStatic,它定义了一个像这样的全局变量

头文件libStatic/globals.h

代码文件libStatic/globals.cpp

DLL libDynamic和可执行运行程序正在使用这个全局变量。此外,libDynamic在运行时链接到runner(通过LoadLibrary()GetProcAddress()和作品...)

我知道这将导致globvar被创建两次,一次在runner堆中,一次在libDynamic堆中,这当然是非常不可取的。

这附近有什么好的地方吗?如何确保libDynamicrunner使用相同globvar

0 投票
1 回答
340 浏览

python - 从.so文件与python中的ctypes链接时奇怪的行为改变

我正在为我的博士学位编写一个程序来处理来自高速相机的数据。项目。该相机在 Linux 上带有一个 .so 文件形式的 SDK,用于与相机通信并获取图像。如前所述,它是一种高速摄像机,可提供大量数据(每分钟几 GB)。为了处理如此大量的数据,SDK 有一个非常方便的假脱机功能,它通过 DMA 以 FITS 文件的形式直接将数据假脱机到硬盘驱动器,这是一种在天文学中使用的带有标头的原始二进制格式。当我编写一个小型 C 程序,将 .so 文件链接进去并以这种方式调用假脱机函数时,这个函数可以正常工作。但是当我用 ctypes 包装 .so 文件并从 python 调用函数时,除了 spool 函数之外,所有函数都在工作。当我调用假脱机函数时,它不会返回任何错误,但是假脱机数据文件是乱码,该文件具有正确的格式,但所有帧的一半是 0。在我的世界里,.so 文件中的函数应该根据调用它的程序、我自己的小 C 程序或 python(毕竟只是一个更大的 C 程序)而表现不同是没有意义的。当从不同的程序调用 .so 时,有没有人知道有什么不同?

我会非常感谢任何建议

尽管相机是商用的,但有些驱动程序是 GPL 并且可用,尽管有点复杂。(不幸的是,它似乎不是假脱机功能)我在 python 中有一个用于 Handel 相机的对象。

课程的开头写道:

相关功能如下:

在相应的标题中,它显示:

让相机运行的代码如下所示:

0 投票
6 回答
4240 浏览

performance - 为什么要创建 DLL 而不是将所有内容编译成一个大的可执行文件?

我看到并自己做了很多产品,其中同一个软件被分成一个可执行文件和几个 DLL,这些 DLL 不仅仅是由其他人完成的共享库,而是专门为这个软件完成的库,由同一个开发团队。(我在这里不是在谈论只需要数百个 DLL 并与其他产品广泛共享的大型产品。)

我知道从开发人员的角度来看,将代码分成几个部分,每个部分都编译成一个单独的 DLL,这很好。代表着:

  • 如果开发人员更改了一个项目,他只需要重新编译这个项目和依赖的项目,这会更快。
  • 一个项目可以由团队中的单个开发人员完成,而其他开发人员将只使用提供的接口,而无需进入代码。
  • 软件的自动更新有时可能更快,对服务器的影响更小。

但是最终用户呢?当所有东西都可以组合在一起时,交付一个由一个 EXE 和几个 DLL 组成的软件不是很糟糕吗?毕竟:

  • 用户甚至可能不明白这些文件是什么以及为什么它们会在他的硬盘上填满内存,
  • 用户可能想要移动程序,例如将其保存在 USB 闪存驱动器上。拥有一个大的可执行文件让事情变得更容易,
  • 大多数防病毒软件都会检查每个 DLL。检查一个可执行文件将比较小的可执行文件和几十个库快得多。
  • 使用 DLL 会使一些事情变慢(例如,在 .NET Framework 中,必须找到一个“好”的库并检查它是否已签名),
  • 如果 DLL 被删除或替换为错误版本会怎样?每个程序都处理这个吗?或者它甚至没有解释它有什么问题就崩溃了?
  • 拥有一个大的可执行文件还有其他一些优势

那么从最终用户的角度来看,对于中小型程序来说,交付一个大的可执行文件不是更好吗?如果是这样,为什么没有工具可以轻松做到这一点(例如,集成在通用 IDE 中的魔术工具将整个解决方案编译成一个可执行文件,当然不是每次,而是按需或在部署期间)。


这在某种程度上类似于将所有 CSS 或所有 JavaScript 文件放入一个大文件中供用户使用。拥有多个文件对开发人员来说更智能并且更易于维护,但是将网站的每个页面链接到两个文件而不是几十个文件可以优化性能。同样,CSS sprite对设计师来说很糟糕,因为它们需要更多的工作,但从用户的角度来看却更好。

0 投票
1 回答
1864 浏览

c++ - Boost Test是动态链接还是静态链接?

我们使用与我们的应用程序静态链接的 Boost,但现在我想将 Boost Test 与外部测试运行器一起使用,这需要测试本身通过使用所需的BOOST_TEST_DYN_LINK定义与 Boost.Test 动态链接。

这会是一个问题,还是 Boost Test 链接的方式与其他 Boost 库的链接方式完全无关?

0 投票
1 回答
98 浏览

visual-studio-2008 - Visual Studio 2008 中的棘手链接错误

在 Visual Studio 2008 中,我有一个包含两个项目的解决方案:一个项目是 .dll,另一个是调用 .dll 的命令行应用程序。

如果我删除其中一个文件(“ast.c”),然后直接将其重新添加,我会收到以下错误。

如何修复此错误?

错误 22 错误 LNK2019:函数“double __cdecl d_low(struct ast_node *, struct ast_node *,struct ast_node *,struct ast_node *,void *)" (?d_low@@YANPAUast_node@@000PAX@Z) main.obj main

0 投票
7 回答
4697 浏览

c++ - 可热插拔的 C++ 库可能吗?

我正在寻找“热插拔”C++ 代码库。我有兴趣让这种技术在 Linux/Mac/Windows 之间跨平台工作。基本上我想拥有定义所有可调用接口的主程序#include“StateMachine.h”。然后在运行时和 DURING EXECUTION 加载和卸载 StateMachineLibrary.a 以让我的应用程序使用不同的状态机。

我的一个想法可能是写一个包装器,将这个编译的代码加载到我自己的 malloc'd 内存中并在该内存中创建函数指针?

动机是我项目的状态机部分将经常更改并需要重新编译,也将允许主应用程序在加载不同的状态机的情况下继续运行。由于某些问题,我希望使用“热插拔”库来代替 Lua 脚本之类的东西,因此考虑到已经探索了替代方案。

0 投票
1 回答
60 浏览

c++ - 对库的可执行依赖

共享可执行文件时,我真的需要担心用于制作该可执行文件的库吗?似乎在生成 exe 时应该考虑到这一点,而不是在必须运行它时。只是好奇。我很确定我不必担心,但想问这个问题以确保。安全总比后悔好。

0 投票
3 回答
99326 浏览

language-agnostic - 在 Mac OS X 上使用 DYLD_LIBRARY_PATH 可以吗?而且,它的动态库搜索算法是什么?

我读过一些不鼓励使用 DYLD_LIBRARY_PATH 的文章,因为动态库的路径应该使用 -install_name、@rpath 和 @loader_path 来固定。

在制作同时在 Linux 和 Mac OS X 上运行的程序方面,Mac OS X 的 DYLD_LIBRARY_PATH 与 Linux 的 LD_LIBRARY_PATH 完全相同。而且,我们可以(几乎)共享同一个没有-install_name 和@rpath 的make 文件。

  • 在 Mac OS X 上使用 DYLD_LIBRARY_PATH 可以吗?
  • 当二进制文件找不到动态库时,Mac OS X 的动态库搜索算法是什么?当前目录-> DYLD_LIBRARY_PATH 目录...?
0 投票
1 回答
485 浏览

iphone - 升级到 iPhone SDK 4.0 后未找到符号错误,在 3.1.3 上运行

我刚刚升级到 iPhone SDK 4.0,并重新编译了我的静态库和应用程序,当我在装有 iOS 3.1.3(使用部署目标 3.0)的设备上运行它时,它说:

我找到了这篇博文,但除了它似乎没有提供任何建议

  1. 尝试使用 gcc 4.0 而不是 4.2,并且

  2. 它应该已在 SDK 4.0 中修复。

看来他指向的代码已在 SDK 4.0修复(并且他展示此行为的最小应用程序示例对我来说效果很好),但我仍然收到此错误。

0 投票
1 回答
1673 浏览

objective-c - 未找到符号:_OBJC_CLASS_$_Article

我正在对Vienna进行扩展,以增加第三方编写 Objective-C 插件的能力,但是只有在 64 位模式下运行时我才会遇到一些运行时链接器问题(在 32 位模式下一切似乎都可以正常工作) . 我的插件 SynkPlugin 由 Vienna.app 中的以下代码加载:

在控制台输出中,我收到以下错误消息:

此错误仅在以 64 位模式运行时发生,而不是在 32 位模式下运行。Vienna 和 SynkPlugin 都使用“标准 32/64 通用”设置进行编译,并且 SynkPlugin 具有附加的链接器标志“-undefined dynamic_lookup”,据我了解,它允许它链接到在 Vienna.app 中找到的类而无需将这些类的代码编译成自己的二进制文件。

Stack Overflow 上对这个错误的其他引用与 iPhone/iPod Touch 和 iPad 之间的 UIKit 差异有关——在这些情况下,框架实际上缺少 iPhone/iPod Touch 上的类。在我的例子中,我确信 Vienna.app 在它的某个地方有 Article 类,因为它是由与 32 位版本相同的代码构建的。

有没有人见过这样的错误?对在哪里寻找更多信息有什么建议吗?谢谢。