问题标签 [shared-libraries]

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 投票
5 回答
12295 浏览

c++ - 有人可以解释一下 Linux 库命名吗?

在 Linux 上创建库时,我使用这种方法:

  1. 构建:libhelloworld.so.1.0.0
  2. 链接:libhelloworld.so.1.0.0 libhelloworld.so
  3. 链接:libhelloworld.so.1.0.0 libhelloworld.so.1

版本控制是这样的,如果您更改面向公众的方法,您可以构建到 libhelloworld.so.2.0.0 例如(并将 1.0.0 保留在原处),这样使用旧库的应用程序就不会中断。

但是,将其命名为 1.0.0 有什么意义 - 为什么不坚持使用 libhelloworld.so 和 libhelloworld.so.1?

此外,最好的做法是使用 1.0.0 来命名您的库,还是仅使用 1?

或者:

0 投票
5 回答
1364 浏览

c++ - C++ 中共享库主头文件的最佳实践是什么?

当我创建共享库时,我在库源的根目录中有一个与库同名的头文件(但没有文件扩展名)。

例如,如果我的库名为 libirock.so,那么我将在项目根目录中有一个名为 irock 的文件。该文件将包含库中所有最重要的头文件,因此当要实现库时,您需要做的就是使用以下包含行:

当我看到类似于以下内容的编译器警告时,我得到了这个想法:

两个问题:

  1. 是使用 irock 代替 irock.h 的最佳实践吗?
  2. 使用单个头文件而不是多个头文件是否正确?

行动方针

感谢您的回答!根据答案,我决定:

  1. 将使用<irock.h>而不是<irock>.
  2. 我将继续使用“主要”头文件。
0 投票
1 回答
2705 浏览

c++ - 如何在 Windows 上使用 eclipse/gdb 调试共享库?

在我的大学,我们目前正在使用开源工具在 Windows 上开发 VST 插件。

我的教授非常喜欢 Microsoft Visual Studio,对 Eclipse、GCC、Subclipse 等开源工具持怀疑态度。
然而,直到现在我都能解决他所有的问题,如果他不能被说服,那就太可惜了这个开源工具链与他的 MSVC 环境同样强大。

VST-Plugin 是一个用于音频处理的共享库。我们使用 Tobybear Minihost 作为我们的测试应用程序,它工作得很好。但是,我们无法调试它。我们可以设置断点,但是当 Minihost 打开插件时 Eclipse 无法识别它们。

你知道如何在 Windows 上使用 GDB/Eclipse 调试共享库吗?

0 投票
7 回答
114733 浏览

c - 为什么每次运行应用程序时都必须使用导出定义 LD_LIBRARY_PATH?

我有一些使用一些共享库的代码(gcc 上的 c 代码)。编译时,我必须使用 -I 和 -L 显式定义包含和库目录,因为它们不在标准位置。当我尝试运行代码时,出现以下错误:

但是,执行以下操作,一切正常:

现在,奇怪的是,这只能工作一次。如果我再次尝试运行sync_test,我会得到同样的错误,除非我先运行导出命令。我尝试将以下内容添加到我的 .bashrc 中,但没有任何区别:

0 投票
2 回答
732 浏览

c++ - SQLite 磁盘使用情况

SQLite 以小巧、快速和灵活而著称。我在我的一个 C++ 项目中使用它来将简单的统计信息保存到文件中。一次 15 分钟,将 3-5 条新的简单记录(5 行整数)保存到数据库中。在这样使用 SQLite 的几周内,我很快就观察到了明显的磁盘使用情况。我没想到,因为写入的数据量非常小。如果我将它写入纯文本文件,则磁盘的反应几乎不会引起注意。SQLite 真的是这样轻量级的数据库,还是我的问题太简单而无法使用关系数据库?

0 投票
2 回答
3018 浏览

c# - Linux、Mono、共享库和未解析的符号

我有一个 shim 库(共享,C++),它调用另一个共享库(libexif)中的函数,并为平台调用调用提供了一个简单的 C# 接口。(也就是说,一个 C# 程序使用 PInvoke 调用我的自定义共享库,该共享库又调用另一个共享库。)

在 Windows 中,当我的自定义库链接和 C# 应用程序执行时,我的自定义共享库链接到共享库,所有符号都被解析。

在 Linux 上,链接我的共享库不会链接其他共享库。使用 C++ 驱动程序,我在链接应用程序时指定另一个库,此时所有符号都已解析。但是,当我尝试从 C# 程序(使用单声道编译)调用我的共享库时,其他共享库中的符号无法解析。我尝试使用 MONO_PATH 变量来指定另一个库,但似乎没有什么不同。我还尝试在 DLLimport 语句中指定未解析的函数,但这似乎也无济于事。

如何指定 C# 代码不直接调用的共享库,以便 mono/cli 在运行时找到它?

我使用以下命令来构建共享库:

以及以下命令行来编译我的 C# 驱动程序:

在执行时,我收到一个错误,即找不到我的共享库使用的符号:

(libexif-wrapper 是我的共享库,它充当 C# 应用程序和 libexif 之间的垫片。)

我一直无法弄清楚如何解决这个问题。任何建议,将不胜感激。

编辑:回答问题:

您确定可以在 LD_LIBRARY_PATH 环境变量中找到非托管 libexif-wrapper 吗?

事实上并非如此。我已经在 DLLImport 中设计了直接指向它的路径。运行时找到它是因为它在上面的错误消息中报告了它的路径。此外,缺少的符号不是由 C# 程序调用的,而是我的共享库中的一个函数调用了随后找不到的函数。(谢谢 - 汉克)

0 投票
2 回答
93582 浏览

gcc - 使用 gcc 链接共享库

我在 windows 目标上使用 Real View Compiler Tools (RVCT 3.2) 创建了一个共享库 (*.so)。然后我尝试在 linux 系统上使用 gcc 将此 *.so 文件与我的应用程序链接。

将此共享库与我的应用程序 linux 链接的 gcc 选项是什么?

我的问题是,是-shared选项,它被用作

...,用于创建 SO 文件或链接 SO 文件?我相信它会产生类似的东西:

这够了吗?或者是否有任何其他开关告诉链接器它是一个动态库(共享对象)?

0 投票
1 回答
398 浏览

shared-libraries - Common Lisp:在共享主机环境中使用库的最佳方式是什么?

前几天我在考虑这个问题,想看看 SO 社区对这个主题有什么看法。

就目前而言,Common Lisp 作为一个 Web 开发平台受到了一些关注,并且有充分的理由(我相信你已经对此深信不疑)。

我想知道如何以与 PHP 类似的方式在共享环境中使用库。

如果我设置 SBCL 之类的东西作为解释器来解释 Python 或 PHP 等 FASL 文件,那么使用库(例如clsql)的最佳方式是什么。

大多数都是 asdf 可安装库,但是每次发出请求时都需要并安装库,这将是一笔愚蠢的开销。

请记住,这是针对共享主机的;最好..

1) 安装库的系统范围副本以在应用程序中使用;减少空间,但使用正确版本的库可能会出现问题。

2) 允许用户(通过控制面板)为自己安装本地副本;更多空间,没有版本问题。

3)告诉他们将它包装到一个模块中并像 Python 那样按需加载它(我不确定是否/如何使用 Lisp 来完成)。仅仅能够加载一个库以供使用将是最好的选择,但我认为它们中的很多都不是为了以这种方式使用而设计的。

无论如何,想听听你的意见,谢谢。

0 投票
4 回答
1124 浏览

xml - 为什么我必须为 libcl.2 使用 LD_PRELOAD 才能在 HP/UX 上使用 XML::LibXML::Common?

仅在 HP 平台上强制执行 LD_PRELOAD,而不在其他 unix 风格(AIX、Linux 和 Solaris)上强制执行。

我在所有 Unix 风格上构建了 Perl 模块XML::LibXML::Common 。我必须专门为 HP 平台上的 libcl.2 库执行 LD_PRELOAD。而在其他 unix 平台上则不需要这样的东西。

这是操作系统行为还是 HP 加载器/编译器中真正缺少的东西?

我正在运行一个 perl 脚本,它只是创建一个“XML::LibXML::SAX”的新对象

它抱怨

无法为模块 XML::LibXML::Common 加载“site_perl/5.8.8/PA-RISC2.0-thread-multi/auto/XML/LibXML/Common/Common.sl”:执行格式错误

当我为 libcl.2 执行 LD_PRELOAD 时,错误消失了,Perl 是为多线程支持而构建的。

0 投票
3 回答
33981 浏览

linux - 如何从共享库中导出符号

我使用 Windows 主机上的 RVDS 编译器使用目标代码文件(C 源代码)创建了一个共享库 ( *.so) 。*.o

我将此共享对象与一个应用程序(gcc用于 Linux 主机上的 ARM 目标)链接并获得一个可执行文件,该可执行文件在运行时会产生分段错误。(我知道我必须调试它!)

如果我创建一个具有相同源文件的静态库,而不是创建共享库,然后与应用程序链接,然后执行应用程序,它可以按预期正常工作。

所以我的问题是:

  1. 我是否需要使用某些结构在我的源文件中显式导出符号(导出到应用程序的函数)或任何其他符号,以便在与应用程序链接时正常工作?需要什么,我该怎么做?

  2. 共享库是如何工作的?即,函数将被加载和运行的地址,将在创建库时在库中给出。应用程序(main())如何解析要执行库函数的地址?

  3. 静态库是如何工作的,即在静态库的情况下,这个地址规范和解析是如何发生的?