问题标签 [dynamic-library]

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 回答
301 浏览

c - 如何将 c++ 程序编译成共享库,并从 ac 程序中加载?

我在centos 6上使用gnu c编译器,c程序动态加载代码中的共享库。

0 投票
2 回答
990 浏览

java - 根据操作系统动态加载 jar

我正在尝试找到一种为当前操作系统动态加载平台相关库 jar 的方法。我需要访问使用 JNI 调用的第三方库,并为 Mac 和 Windows 提供不同的 jar。这两个库的所有调用和返回都是相同的,只需在编译后换出 lib 目录中的 jar 文件即可,但我希望我的应用程序能够确定应该在运行时加载哪个 jar。

我在这里找到了类似的帖子,但没有直接解决这个问题。 这篇文章展示了如何通过 ClassLoader 动态加载 jar,但据我所知,这意味着我必须使用Method method = clazz.getDeclaredMethod("methodName"),method.invoke()方法来调用该类提供的任何方法,并显式调用要加载到该类的每个类loader(我非常想避免)。

我希望找到一个看起来像这样的解决方案:

0 投票
1 回答
320 浏览

macos - 有关 MacOS 上的 __dyld__dyld_start 等函数的更多信息

在 MacOS 上,我看到一个看起来像这样的堆栈(在堆栈的最顶端是一个陷阱,有问题的代码,但我想了解我是如何到达那里的)

函数 appLibInit::appLibInit 是我们代码中全局对象的 C++ 构造函数,所以我猜我在某种预主代码中,可能处理所有链接到的共享库(奇怪的是代码在问题不是我们期望与我们联系的东西,除非它被其他东西拖进来)。

mac c++filt 似乎没有解码这些 __dyld 前缀符号。

有人知道一些描述 MacOS 进程启动顺序的文档,这可能会给我更多的线索吗?

0 投票
2 回答
26384 浏览

macos - MacOS——如何使用 gcc/ld 将动态库与相对路径链接

如果您想了解动态链接,这个问题可能会很有趣。

该问题的一个答案提供了一个创建和使用动态库的绝妙示例。在此基础上,我做了一些简单的文件:

主.c:

图书馆.c:

生成文件:

到目前为止,一切都很好。如果我 make 然后在命令提示符下输入 ./main ,我会看到预期的输出:

现在,我想把事情混为一谈。我创建了一个目录 hidelib,它是我的主目录的子目录。我在我的makefile中添加了一行:

现在,我想在 makefile 中添加另一行,以便在 hidelib 子目录中找到 libmylibrary.dylib。我希望能够以相同的方式运行 ./main。我怎样才能做到这一点?

编辑:感谢您的回复。有很多选择固然很棒,但初学者只想要一个可行的具体选择。这是我在最后一行尝试的内容,但显然我不明白。makefile 执行时没有错误,但在运行时显示“找不到库”。

0 投票
1 回答
1099 浏览

ios5 - 在 iOS 应用程序中包含 ObjectiveGit 库

打开 ObjectieGitFramework.xcodeproj 文件时,我现在可以成功构建 iOS 方案。虽然需要进行大量的实验。让我们从头开始——我是怎么做到的。

我做了什么:

首先,我克隆了一个 ObjectiveGit 的分支。

源:https ://github.com/libgit2/objective-git/pull/54

现在打开项目并构建会导致一个错误和一个警告。我让 Xcode 自动更新项目设置来解决警告。 错误

现在我进入目录并使用cmakelibgit2构建:

源:https ://github.com/libgit2/libgit2

除其他外,这会导致libgit2.0.15.0.dylib正在创建的文件中。 查找器中的文件图像

我将它拖入 Xcode 并将其添加到 ObjectiveGit 和 iOS 目标。现在我转到 ObjectiveGit-iOS 的构建阶段选项卡,让它看起来像这样:

在此处输入图像描述

问题

此时我可以构建项目,并且可以使用ObjectiveGit. 但是,当我将项目拖到另一个项目中,添加ObjectiveGit-iOS为目标依赖项并添加libObjectiveGit-iOS.a时,link binary with libraries我无法导入ObjectiveGit/ObjectiveGit.h,而且我遇到了一些其他奇怪的错误(见下图)。我对 xcode 中的库知之甚少,所以我根本不知道为什么这不起作用。

在此处输入图像描述 在此处输入图像描述

现在,这是我曾经遇到的一个错误,但现在没有了。我不知道我做了什么导致它。 在此处输入图像描述

更新

当将此添加到header search path奇怪的事情发生时。它导致没有找到文件,而是 70 个其他 Mach-o 错误。

```

0 投票
2 回答
1627 浏览

c++ - 在动态库中隐藏符号而不修改源代码

我有一个需要链接的闭源第 3 方共享库。不幸的是,第 3 方库的创建者并没有费心限制导出哪些符号并导出所有符号。第 3 方库在内部使用了我在代码中使用的流行库的不兼容版本,但导出了冲突的符号(google 的 protobuf 库)。当 protobuffer 库版本检查发现库的编译时和运行时版本不兼容时,这会导致运行时错误。我可以通过恢复到与 3rd 方库中使用的版本相匹配的旧版本 protobufs 2.3 来解决问题。但是,protbuf 2.3 存在性能问题,导致我的应用程序无法使用它。我需要一种在我的代码中使用 protobuf 2.4 并让第 3 方库使用它的方法'

有没有办法生成一个新版本的 3rd 方库,它不会从仅给定 so 文件的内部使用的 protobuf v 2.3 库中导出符号?如果我有来源,那将是一个更容易的问题。似乎objcopy和strip之类的工具实际上并不能修改动态符号表。到目前为止,我唯一的想法是创建自己的 shim 库,通过将调用重定向到第 3 方库(也许用 dlopen 打开?),只导出我需要的符号。

有更好的解决方案吗?

0 投票
1 回答
144 浏览

linux - Linux 上 libgcc_s.so.1 的次要版本

我注意到在 SLES SP1 和 Ubuntu 10.04 上它们只有一个主要版本的 libgcc_s in /lib64. 但是在 RHEL 6.1 上,它们的主要版本指向次要版本,日期附加到库的次要版本。我需要提供给客户支持的矩阵的次要版本。如何在 Ubuntu 和 SLES 中获取 libgcc 的次要版本?

0 投票
2 回答
153 浏览

c++ - 我可以禁止某些功能使程序崩溃吗?

我想做一个交互式代码学习系统,它允许用户(通常是年轻程序员)用c ++语言编写一个函数的内容,将其发送到服务器,在那里它将被编译成动态库并从主程序调用。

程序期望函数根据给定的参数返回正确的答案。

当然,会有一些孩子,这会导致像分段错误这样的错误。(服务器由 Linux 驱动)。

那么,我可以制作退出函数的信号处理程序吗?

我希望完成的事情:

0 投票
2 回答
900 浏览

c - C 头文件和动态链接错误

我创建了一个动态链接库。我唯一的问题是我的主程序无法识别我的头文件。头文件位于与我的主程序不同的文件夹中。我试过#include "myheader.h"#include "/folder/dir/myheader.h"

这是我的 .h 包含的内容

到目前为止,此代码有效

然后我将 lib 复制到/usr/local/lib, 然后

我得到

这是我的目录结构:

directory1 ----------------folder1(主程序.c)

directory1 ----------------folder2(myheader.h,以及 pgm 的函数)

朝着正确的方向前进会有所帮助,因为我已经编写了所有代码,而且我正处于最后阶段。

0 投票
1 回答
1460 浏览

c - 如何将 LKM(可加载内核模块)链接到静态或动态库?

搜索后,我找不到任何 LKM 使用静态或动态库的示例。

我想创建静态和动态库(可能使用标准 C 库或任何其他库),然后开发一个使用我自己的静态和动态库的 LKM。

如何将 LKM(可加载内核模块)链接到静态或动态库?