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

linker - 即使 nm 指示此符号存在于共享库中,也未定义对符号的引用 2

我在这里发现了同样的问题,但答案对我没有帮助。

我正在编写测试应用程序以使用 nglib 库。但是当我尝试编译它时,我得到未定义的引用:

但例如当我在 libnglib.so 中搜索 Ng_Init() 时,我得到了肯定的结果。

所以我很困惑为什么我会收到未定义的参考错误?!

0 投票
2 回答
384 浏览

c - 如何不忽略 dyld 的最大版本

我正在尝试在 OS X (10.7.5) 下对共享库进行版本控制,但我无法dyld识别最大兼容性版本(最低版本还可以)。考虑下面的测试代码和以下场景:

  1. 二进制链接到版本 1.0 的库,兼容性版本 1.0

    • binary按预期工作
      • otool -L binarylibdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
      • otool -L libdyldtest.dyliblibdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
  2. 库更新并重新编译,移至 2.0 版,兼容 1.0 版

    • binary应该仍然可以工作,并且确实可以,因为库的兼容性已经足够老了
      • otool -L binarylibdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
      • otool -L libdyldtest.dyliblibdyldtest.dylib (compatibility version 1.0.0, current version 2.0.0)
  3. 库已更新并重新编译为不兼容的版本。将版本和兼容版本都设置为 3.0。二进制不重新编译。

    • binary应该停止工作,因为它想要与 1.0 兼容但libdyldtest仅与 3.0 及更高版本兼容的东西。为什么这行得通?
      • otool -L binarylibdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
      • otool -L libdyldtest.dyliblibdyldtest.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 binarylibdyldtest.dylib (compatibility version 1.0.0, current version 1.0.0)
      • otool -L libdyldtest.dyliblibdyldtest.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:

生成文件:

0 投票
2 回答
3789 浏览

c++ - 确定是否存在动态库的多平台方法

我需要检查是否存在动态库,以便以后可以安全地调用使用该库的函数。

有没有多平台的方法来检查这个?我的目标是 MS Windows 7 (VC++11) 和 Linux (g++)。

0 投票
3 回答
159 浏览

c++ - 与我自己的 C++ 库链接错误

这是我第一次尝试制作一个简单的库。我在 Ubuntu 12.04 中使用 g++ 4.6.3 工作。这是问题所在:

然后我通过以下方式制作了库:

我在仅包含 main() 的单个 test.cpp 中使用了该库。我将 libmylib.so 放在 ./libdir 中,并使用以下命令进行编译:

我得到的错误:

0 投票
1 回答
835 浏览

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 中观察到以下行为

  1. obj1 和 obj2 的静态类声明中的断点被命中。
  2. obj1 和 obj2 的对象已正确初始化。
  3. 放置在构造函数中的断点也会被命中。

在 Mac OS X 上

  1. 由于此静态声明,声明和构造函数中的断点不会被命中。
  2. 对象 obj1 和 obj2 未初始化。

在 Mac OS X 上,对象中的所有内容都由零初始化。每个地址都是 NULL。

但是,当我将这些变量移动到静态库(链接到这个 dylib)时,一切都按照预期运行。

dylib 中是否存在全局/静态对象的问题?

0 投票
1 回答
151 浏览

c - 包括一些 .so 文件

我正在尝试使用我编写的一些动态库,但 gcc 似乎无法找到它们,我不明白为什么会这样。据我了解,libresistance.so、libcomponent.so 和 libpower.so 文件都位于 /usr/lib 中,这是 Linux 中动态库的默认位置。那么我做错了什么?

C 文件

生成文件

0 投票
1 回答
192 浏览

macos - 在 Mac 系统上检测框架使用情况?

我想在 OSX 上开发示例框架,并要求该框架在任何时候都只能由单个客户端使用,我不知道如何实现这一点?他们是否有任何 API 来检测框架正在使用的天气?我们可以为此使用一些与文件相关的 API 吗?..我看过一个 Windows 示例,他们在其中使用以下 API 检测 dylib 的使用情况?CreateFileMappingW MapViewOfFile OpenFileMappingW

有没有人遇到过这样的场景??

0 投票
1 回答
2609 浏览

c++ - .so 文件 Linux

我有一个这样的 C++ .so 文件结构:(动态库)

你们知道如何编译和运行上面的文件吗,我尝试编译.so并运行了makefile,但它仍然是一个错误:


G++编译:

0 投票
1 回答
988 浏览

linux - 共享对象中局部符号的重定位 R_386_JUMP_SLOT

我正在研究动态重定位过程,并创建了一个非常简单的共享对象:

编译为:

如果我们查看共享对象的动态重定位:

该符号有一个 R_386_JUMP_SLOT,因此PLT 解决了func_1其中的调用。func_2我不知道这是什么原因...如果func_1声明为私有(static),则重定位将消失,并且调用(通过静态链接器)通过相对分支解决。为什么从PLT传球比相对跳跃要好?

0 投票
1 回答
1530 浏览

c - Makefile:链接 .*a 库

描述:我有一个库 libshel​​l.a,里面是我正在尝试使用的函数 ord_interna,但是似乎我链接错了,你们能解决我的错误,所以我以后不做了吗?干杯,

错误:

生成文件: