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

c++ - 在 Linux 中链接动态共享库 - 未定义的函数引用

我知道有很多与 Linux 上的共享库相关的问题,但可能是因为我厌倦了在 Linux 上创建一个简单的动态库(在 Windows 上只需不到 10 分钟)我找不到在这种情况下会发生什么。因此,我正在尝试创建一个在构建时链接并在运行时使用的库(不是静态库,也不是要嵌入到可执行文件中的库,换句话说)。现在它包含一个简单的功能。这些是我的文件:

1.

2.

3.

这就是我尝试构建项目的方式(我认为这是错误的):

这被保存为 .sh 文件,我在终端中单击并执行该文件。尝试链接库时出现的错误是:

这就是我迷路的地方。我希望库现在与可执行文件位于同一文件夹中,也许我需要一些符号/定义文件或其他东西,我不知道如何创建。谢谢你的帮助!

0 投票
1 回答
326 浏览

shared-libraries - 我可以构建一个 .dylib 包括其他一些 .dylib 符号(在 C 中)吗?

我正在尝试创建一个 .dylib 包括其他 .dylib 符号

例如:我有 libA.dylib 和 libB.dylib,我想制作包含 libA 和 libB 符号的 libcore.dylib

我知道我可以使用 Ao 和 Bo 制作 libcore.dylib

然后用 nm -g libcore.dylib :我可以找到 AFunctions 符号和 BFunctions 符号

现在我想知道是否可以使用我尝试过的 libA.dylib 和 libB.dylib 构建 libcore.dylib:

我当然没有编译错误,但是 libcore 中没有引用 libA 和 libB 符号,只是依赖于 nm -g libcore.dylib 我没有符号

有办法吗?

0 投票
2 回答
1606 浏览

ios - 检测iOS dylib(越狱)

我的应用程序(越狱的 iOS)是否有一种优雅的方式(Objective C 或 C)来检查特定的动态库在 iOS 中是否可用,而不是使用NSFileManager或调用检查实际的 dylib 文件是否存在于特定路径中dlopen?(例如,一个包含我可以访问的可用动态库信息的对象。)

更新:我知道我也可以在我的项目设置(Xcode)中要求它,但是如果 dylib 不可用,应用程序只会在启动时崩溃,没有任何反馈(如果有办法抓住这个并发出警报在崩溃之前,这也是一个可以接受的解决方案)。

0 投票
2 回答
188 浏览

c - 允许 C 中动态加载的库“发布”函数以供使用

我正在用 C 语言编写一个程序,它允许用户实现自定义“函数”以由各种解释器运行。我还希望允许用户用纯 C 语言编写这些自定义函数,然后动态加载。为了做到这一点,我创建了两个结构,一个用于解释函数,一个用于本地函数。

这是一个简化的示例:

然后我使用identifier每个结构的属性将它们放入一个哈希表中,然后我可以使用它在运行时执行它们。

我的问题实际上来自另一端,加载的库。我希望能够允许加载的库“发布”他们想要插入列表的函数。例如,也许有这样的功能:

然后,当我init从库中调用一个函数时,他们可以调用这个函数将函数插入到哈希表中。

这行得通吗?我对如何register_func_native链接函数有点困惑,因为加载的库需要它,但必须由加载器本身定义。我的加载器功能是否需要在另一个共享库中实现,然后可以在运行时链接?

0 投票
2 回答
1364 浏览

linux - /proc/$PID/pmaps 中出现了哪些库?

在 Linux 上,您可以检查 /proc/$PID/pmaps 以查看特定程序加载的库,并且程序可以打开 /proc/self/pmaps 以检查它本身已加载的库。

我知道 pmaps 只会包含动态库,显然内核无法预测我们以后可能会打开哪些库,所以我希望这些库不包含在 /proc/self/maps 中。但我不确定其他一些情况:

  1. 是否包含在构建时已链接但我们尚未调用任何函数的库?我的理解是 Linux 会延迟链接符号,直到第一次使用它们,所以我不确定它们是否会出现。

  2. pmaps 是否包含所有递归使用的库?例如,如果我查看 pmaps 中的每个库并在其上运行 ldd,然后在这些库上运行 ldd,令人作呕,我不应该找到任何不在原始 pmaps 中的新库?我在几个二进制文件上试过这个,看起来是这样,但也许我很幸运。

0 投票
7 回答
4684 浏览

c++ - C++ 中的动态库、插件框架和函数指针转换

我正在尝试在 C++ 中创建一个非常开放的插件框架,在我看来,我已经想出了一个方法来做到这一点,但是一个唠叨的想法一直告诉我,我正在做的事情非常非常错误,它要么不起作用,要么会导致问题。

我的框架设计包含一个调用每个插件init功能的内核。然后 init 函数转而使用内核的registerPluginandregisterFunction获取唯一的 id,然后分别注册插件希望使用该 id 访问的每个函数。

函数 registerPlugin 返回唯一的 id。函数 registerFunction 接受该 id、函数名称和通用函数指针,如下所示:

plugin_function 在哪里

然后内核获取函数指针并将其放入带有function_nameand的映射中plugin_id。所有注册其函数的插件都必须将该函数强制转换为 type plugin_function

为了检索函数,不同的插件调用内核的

然后该插件必须将其plugin_function转换为其原始类型,以便可以使用它。.h通过访问概述插件提供的所有功能的文件,它(理论上)知道正确的类型是什么。插件,by,被实现为动态库。

这是完成允许不同插件相互连接的任务的聪明方法吗?或者这是一种疯狂且非常糟糕的编程技术?如果是,请指出正确的方法来完成此任务。

编辑:如果需要任何澄清,请询问并将提供。

0 投票
1 回答
73 浏览

compilation - 使用动态库

当我想编译一个使用动态库的程序时,我是否必须安装(即复制到特定位置,例如 /usr/share/lib)这个库?或者是否可以,如果我将这个库放在某个地方的任何地方,然后在链接期间我将链接器指向它,例如'-L ./thelibfolder'?

0 投票
1 回答
215 浏览

c++ - 单例的重复实例化

通过 Mex 开展一个关于 C++ 和 Matlab 合作的大型项目,我们目前正与我们的一个单身人士作斗争。

该类是在预处理期间通过宏生成的,因此看起来有点奇怪。

所有这些代码都是从这一行生成的(通过如上所述的宏):

这是一个很好的界面,我们希望继续使用。

我们想使用这个类作为枚举的替代品,因为我们需要将它们从字符串转换为字符串。在这个类中,我们有 2 个“枚举”成员,即 norm 和 none。

现在我们添加了一些日志记录,并确定 none_string 和 norm_string 函数内的插入操作被调用了两次,即使我们的计数器应该阻止这种情况。

我们尝试过的一些事情:

  • 我们正在使用动态库,但使用 -rdynamic 并没有帮助。
  • 当我们打印静态变量的地址时,我们可以清楚地看到它们不同。
  • 此类位于动态库中,该动态库又与 mex 文件链接。此 mex 文件正在由另一个 mex 文件通过 dlopen 动态加载。

我们在想,由于动态库,可能该类的多个实例被声明并处于活动状态。但是我们也使用了其他类型的没有任何问题迹象的单例。

我希望它足够清楚,可以随时提供额外的信息或澄清!

提前致谢!

0 投票
3 回答
2682 浏览

c++ - C++:实现自定义 Main 函数

WinMain 是一个“替换”默认主入口点“main”的函数。

然后,用户可以定义其主要入口点,例如


这种封装是如何完成的?

好吧,最有可能的是,在某些时候它看起来像这样:

问题:我怎样才能完成我自己的这样一个封装,然后调用 WinMain?注意:我制作的库是一个 DLL,所以它看起来像这样:

然而问题是,DLL 不“知道”该Main()函数,因此会引发“未解析的外部符号”编译错误。那么我怎样才能像这样封装它呢?

0 投票
2 回答
23626 浏览

g++ - 设置 LD_LIBRARY_PATH 环境变量以在运行时加载共享库 (g++)

我有两个与同一问题相关的问题:

  1. 我在 `pwd`/lib 中保存了一个共享对象,虽然使用它的可执行文件编译成功(通过使用 -l 和 -L 开关),但在运行时,它让我很伤心。如果我尝试运行LD_LIBRARY_PATH=/my/absolute/path/to/library/directory ./test它工作正常。但是如果我导出 LD_LIBRARY_PATH=/my/absolute/path/to/library/directory 并./test说它找不到共享库。但是,如果我再做LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test一次,它工作正常!!关于我做错了什么的任何想法?

  2. 第二个问题与 LD_LIBRARY_PATH 环境变量的导出有关。如果我打开终端并键入export LD_LIBRARY_PATH=/path/to/stuff然后键入echo $LD_LIBRARY_PATH,则变量是正确的。但是,如果我编写一个包含导出命令的脚本,仅仅运行它并不会更新变量,而是我需要运行source install.sh才能真正持久化变量。什么是最好的解决方案?

感谢您的时间!