问题标签 [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.
c++ - 在 Linux 中链接动态共享库 - 未定义的函数引用
我知道有很多与 Linux 上的共享库相关的问题,但可能是因为我厌倦了在 Linux 上创建一个简单的动态库(在 Windows 上只需不到 10 分钟)我找不到在这种情况下会发生什么。因此,我正在尝试创建一个在构建时链接并在运行时使用的库(不是静态库,也不是要嵌入到可执行文件中的库,换句话说)。现在它包含一个简单的功能。这些是我的文件:
1.
2.
3.
这就是我尝试构建项目的方式(我认为这是错误的):
这被保存为 .sh 文件,我在终端中单击并执行该文件。尝试链接库时出现的错误是:
这就是我迷路的地方。我希望库现在与可执行文件位于同一文件夹中,也许我需要一些符号/定义文件或其他东西,我不知道如何创建。谢谢你的帮助!
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 我没有符号
有办法吗?
ios - 检测iOS dylib(越狱)
我的应用程序(越狱的 iOS)是否有一种优雅的方式(Objective C 或 C)来检查特定的动态库在 iOS 中是否可用,而不是使用NSFileManager
或调用检查实际的 dylib 文件是否存在于特定路径中dlopen
?(例如,一个包含我可以访问的可用动态库信息的对象。)
更新:我知道我也可以在我的项目设置(Xcode)中要求它,但是如果 dylib 不可用,应用程序只会在启动时崩溃,没有任何反馈(如果有办法抓住这个并发出警报在崩溃之前,这也是一个可以接受的解决方案)。
c - 允许 C 中动态加载的库“发布”函数以供使用
我正在用 C 语言编写一个程序,它允许用户实现自定义“函数”以由各种解释器运行。我还希望允许用户用纯 C 语言编写这些自定义函数,然后动态加载。为了做到这一点,我创建了两个结构,一个用于解释函数,一个用于本地函数。
这是一个简化的示例:
然后我使用identifier
每个结构的属性将它们放入一个哈希表中,然后我可以使用它在运行时执行它们。
我的问题实际上来自另一端,加载的库。我希望能够允许加载的库“发布”他们想要插入列表的函数。例如,也许有这样的功能:
然后,当我init
从库中调用一个函数时,他们可以调用这个函数将函数插入到哈希表中。
这行得通吗?我对如何register_func_native
链接函数有点困惑,因为加载的库需要它,但必须由加载器本身定义。我的加载器功能是否需要在另一个共享库中实现,然后可以在运行时链接?
linux - /proc/$PID/pmaps 中出现了哪些库?
在 Linux 上,您可以检查 /proc/$PID/pmaps 以查看特定程序加载的库,并且程序可以打开 /proc/self/pmaps 以检查它本身已加载的库。
我知道 pmaps 只会包含动态库,显然内核无法预测我们以后可能会打开哪些库,所以我希望这些库不包含在 /proc/self/maps 中。但我不确定其他一些情况:
是否包含在构建时已链接但我们尚未调用任何函数的库?我的理解是 Linux 会延迟链接符号,直到第一次使用它们,所以我不确定它们是否会出现。
pmaps 是否包含所有递归使用的库?例如,如果我查看 pmaps 中的每个库并在其上运行 ldd,然后在这些库上运行 ldd,令人作呕,我不应该找到任何不在原始 pmaps 中的新库?我在几个二进制文件上试过这个,看起来是这样,但也许我很幸运。
c++ - C++ 中的动态库、插件框架和函数指针转换
我正在尝试在 C++ 中创建一个非常开放的插件框架,在我看来,我已经想出了一个方法来做到这一点,但是一个唠叨的想法一直告诉我,我正在做的事情非常非常错误,它要么不起作用,要么会导致问题。
我的框架设计包含一个调用每个插件init
功能的内核。然后 init 函数转而使用内核的registerPlugin
andregisterFunction
获取唯一的 id,然后分别注册插件希望使用该 id 访问的每个函数。
函数 registerPlugin 返回唯一的 id。函数 registerFunction 接受该 id、函数名称和通用函数指针,如下所示:
plugin_function 在哪里
然后内核获取函数指针并将其放入带有function_name
and的映射中plugin_id
。所有注册其函数的插件都必须将该函数强制转换为 type plugin_function
。
为了检索函数,不同的插件调用内核的
然后该插件必须将其plugin_function
转换为其原始类型,以便可以使用它。.h
通过访问概述插件提供的所有功能的文件,它(理论上)知道正确的类型是什么。插件,by,被实现为动态库。
这是完成允许不同插件相互连接的任务的聪明方法吗?或者这是一种疯狂且非常糟糕的编程技术?如果是,请指出正确的方法来完成此任务。
编辑:如果需要任何澄清,请询问并将提供。
compilation - 使用动态库
当我想编译一个使用动态库的程序时,我是否必须安装(即复制到特定位置,例如 /usr/share/lib)这个库?或者是否可以,如果我将这个库放在某个地方的任何地方,然后在链接期间我将链接器指向它,例如'-L ./thelibfolder'?
c++ - 单例的重复实例化
通过 Mex 开展一个关于 C++ 和 Matlab 合作的大型项目,我们目前正与我们的一个单身人士作斗争。
该类是在预处理期间通过宏生成的,因此看起来有点奇怪。
所有这些代码都是从这一行生成的(通过如上所述的宏):
这是一个很好的界面,我们希望继续使用。
我们想使用这个类作为枚举的替代品,因为我们需要将它们从字符串转换为字符串。在这个类中,我们有 2 个“枚举”成员,即 norm 和 none。
现在我们添加了一些日志记录,并确定 none_string 和 norm_string 函数内的插入操作被调用了两次,即使我们的计数器应该阻止这种情况。
我们尝试过的一些事情:
- 我们正在使用动态库,但使用 -rdynamic 并没有帮助。
- 当我们打印静态变量的地址时,我们可以清楚地看到它们不同。
- 此类位于动态库中,该动态库又与 mex 文件链接。此 mex 文件正在由另一个 mex 文件通过 dlopen 动态加载。
我们在想,由于动态库,可能该类的多个实例被声明并处于活动状态。但是我们也使用了其他类型的没有任何问题迹象的单例。
我希望它足够清楚,可以随时提供额外的信息或澄清!
提前致谢!
c++ - C++:实现自定义 Main 函数
WinMain 是一个“替换”默认主入口点“main”的函数。
然后,用户可以定义其主要入口点,例如
这种封装是如何完成的?
好吧,最有可能的是,在某些时候它看起来像这样:
问题:我怎样才能完成我自己的这样一个封装,然后调用 WinMain?注意:我制作的库是一个 DLL,所以它看起来像这样:
然而问题是,DLL 不“知道”该Main()
函数,因此会引发“未解析的外部符号”编译错误。那么我怎样才能像这样封装它呢?
g++ - 设置 LD_LIBRARY_PATH 环境变量以在运行时加载共享库 (g++)
我有两个与同一问题相关的问题:
我在 `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
一次,它工作正常!!关于我做错了什么的任何想法?第二个问题与 LD_LIBRARY_PATH 环境变量的导出有关。如果我打开终端并键入
export LD_LIBRARY_PATH=/path/to/stuff
然后键入echo $LD_LIBRARY_PATH
,则变量是正确的。但是,如果我编写一个包含导出命令的脚本,仅仅运行它并不会更新变量,而是我需要运行source install.sh
才能真正持久化变量。什么是最好的解决方案?
感谢您的时间!