问题标签 [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.
linker - 即使 nm 指示此符号存在于共享库中,也未定义对符号的引用 2
我在这里发现了同样的问题,但答案对我没有帮助。
我正在编写测试应用程序以使用 nglib 库。但是当我尝试编译它时,我得到未定义的引用:
但例如当我在 libnglib.so 中搜索 Ng_Init() 时,我得到了肯定的结果。
所以我很困惑为什么我会收到未定义的参考错误?!
c - 如何不忽略 dyld 的最大版本
我正在尝试在 OS X (10.7.5) 下对共享库进行版本控制,但我无法dyld
识别最大兼容性版本(最低版本还可以)。考虑下面的测试代码和以下场景:
二进制链接到版本 1.0 的库,兼容性版本 1.0
binary
按预期工作otool -L binary
:libdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
库更新并重新编译,移至 2.0 版,兼容 1.0 版
binary
应该仍然可以工作,并且确实可以,因为库的兼容性已经足够老了otool -L binary
:libdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib (compatibility version 1.0.0, current version 2.0.0)
库已更新并重新编译为不兼容的版本。将版本和兼容版本都设置为 3.0。二进制不重新编译。
binary
应该停止工作,因为它想要与 1.0 兼容但libdyldtest
仅与 3.0 及更高版本兼容的东西。为什么这行得通?otool -L binary
:libdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib (compatibility version 3.0.0, current version 3.0.0)
- 设置
DYLD_PRINT_LIBRARIES
显示libdyldtest.3.0.dylib
正在加载
问题是上面的 3 个有效,我认为它不应该。这是预期的行为吗?如果没有,我该如何纠正?
注意:10.7.5 的相关dyld 源代码似乎没有使用结构的maxVersion
成员LibraryInfo
,只有minVersion
. 因此,将最低兼容版本设置得较低可以按预期工作:
- 库设置为版本 0.9,兼容性 0.0
binary
正如预期的那样停止工作。otool -L binary
:libdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
otool -L libdyldtest.dylib
:libdyldtest.dylib (compatibility version 0.0.0, current version 0.9.0)
- 正如预期的那样,运行
binary
结果。Reason: Incompatible library version: binary requires version 1.0.0 or later, but libdyldtest.0.9.dylib
- 正如预期的那样,运行
谢谢!
示例代码
图书馆.h:
图书馆.c:
二进制.c:
生成文件:
c++ - 确定是否存在动态库的多平台方法
我需要检查是否存在动态库,以便以后可以安全地调用使用该库的函数。
有没有多平台的方法来检查这个?我的目标是 MS Windows 7 (VC++11) 和 Linux (g++)。
c++ - 与我自己的 C++ 库链接错误
这是我第一次尝试制作一个简单的库。我在 Ubuntu 12.04 中使用 g++ 4.6.3 工作。这是问题所在:
然后我通过以下方式制作了库:
我在仅包含 main() 的单个 test.cpp 中使用了该库。我将 libmylib.so 放在 ./libdir 中,并使用以下命令进行编译:
我得到的错误:
c++ - 在 Mac OS X 上未初始化静态对象
当我在 Windows 上运行类似的程序(使用 cl 编译器编译)时,值 obj1.count 和 obj2.count 为 5(由默认构造函数初始化)。
但是,当我在 Mac OS X 上运行这个程序(使用 clang 编译器编译)时,obj1.count 和 obj2.count 的值为 0。
我错过了初始化类的静态对象的东西吗?如果有数组需要哪些步骤?
在我的程序中,有一个应用程序加载 dylib(在 Mac OS X 上)或 DLL(在 Windows 上)。此代码是共享库或 DLL 的一部分。
静态对象 obj1 和 obj2 在 DLL 中。正在加载并调用此 DLL。
在 Windows 中观察到以下行为
- obj1 和 obj2 的静态类声明中的断点被命中。
- obj1 和 obj2 的对象已正确初始化。
- 放置在构造函数中的断点也会被命中。
在 Mac OS X 上
- 由于此静态声明,声明和构造函数中的断点不会被命中。
- 对象 obj1 和 obj2 未初始化。
在 Mac OS X 上,对象中的所有内容都由零初始化。每个地址都是 NULL。
但是,当我将这些变量移动到静态库(链接到这个 dylib)时,一切都按照预期运行。
dylib 中是否存在全局/静态对象的问题?
c - 包括一些 .so 文件
我正在尝试使用我编写的一些动态库,但 gcc 似乎无法找到它们,我不明白为什么会这样。据我了解,libresistance.so、libcomponent.so 和 libpower.so 文件都位于 /usr/lib 中,这是 Linux 中动态库的默认位置。那么我做错了什么?
C 文件
生成文件
macos - 在 Mac 系统上检测框架使用情况?
我想在 OSX 上开发示例框架,并要求该框架在任何时候都只能由单个客户端使用,我不知道如何实现这一点?他们是否有任何 API 来检测框架正在使用的天气?我们可以为此使用一些与文件相关的 API 吗?..我看过一个 Windows 示例,他们在其中使用以下 API 检测 dylib 的使用情况?CreateFileMappingW MapViewOfFile OpenFileMappingW
有没有人遇到过这样的场景??
c++ - .so 文件 Linux
我有一个这样的 C++ .so 文件结构:(动态库)
你们知道如何编译和运行上面的文件吗,我尝试编译.so并运行了makefile,但它仍然是一个错误:
G++编译:
linux - 共享对象中局部符号的重定位 R_386_JUMP_SLOT
我正在研究动态重定位过程,并创建了一个非常简单的共享对象:
编译为:
如果我们查看共享对象的动态重定位:
该符号有一个 R_386_JUMP_SLOT,因此PLT 解决了func_1
其中的调用。func_2
我不知道这是什么原因...如果func_1
声明为私有(static
),则重定位将消失,并且调用(通过静态链接器)通过相对分支解决。为什么从PLT传球比相对跳跃要好?
c - Makefile:链接 .*a 库
描述:我有一个库 libshell.a,里面是我正在尝试使用的函数 ord_interna,但是似乎我链接错了,你们能解决我的错误,所以我以后不做了吗?干杯,
错误:
生成文件: