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

java - 默认在哪里安装本地 Java 库?

我正在将 JNI 绑定与 C++ 库集成。

该库遵循通常的约定:/usr/local默认情况下安装根目录,并且可以使用--prefix参数修改为./configure; .a.so文件进入${prefix}/lib;等等

JNI 绑定生成两个新库,libfoojni.so(本机部分)和libfoo.jar(Java 部分)。

在这种方案下,放置这些文件(例如${prefix}/java)的常规位置是什么?

允许用户提供一个单独的 Java 根目录(例如/usr/share/java)是否更可取?

应该libfoojni.so进入${prefix}/lib或进入一些特定于 Java 的子目录?

0 投票
2 回答
152 浏览

c++ - 在 VS 2008 中使用相同设置构建一堆 DLL 文件的最快方法

我目前正在移植一个 POSIX C++ 应用程序以在没有 Cygwin 或任何东西的情况下在 Windows 上运行。到目前为止没有问题。现在,该应用程序(ZNC,一个 IRC 保镖,如果你感兴趣的话)支持从 Linux/BSD 等上的 .so 共享库文件加载模块。

我毫无问题地移植了主要的可执行文件,全部打包到 VS 2008 项目文件中。现在,所述模块都是单独的 .cpp 文件,它们都无法链接到可执行文件,因为它们都导出 GetVersion() 等符号。而且无论如何也不可行。

所以,长话短说,我想(必须)将所有模块(超过 20 个)编译成单独的 DLL 文件。但是,我不想为每个项目创建一个 VS 项目。这意味着我可能必须创建一个makefile?或者类似的东西?我以前从未在 Windows 上这样做过,所以这是我的问题。将一堆 .cpps 编译成单独的 DLL 文件(具有相同的设置,所有这些都方便地存储在一个地方/文件中)的最佳方法是什么?

提前致谢!红外

0 投票
3 回答
28056 浏览

linux - 用于创建指向共享库的符号链接的 Bash 脚本

我认为这个问题对于你的 shell 脚本怪物来说是相当容易的。

我正在寻找通过 bash shell 脚本创建指向 Unix 共享库的符号链接的最优雅和最短的方法。

我需要从共享库文件列表开始,例如“libmythings.so.1.1,libotherthings.so.5.11”,获取创建的符号链接,例如:

库文件位于包含其他文件(例如其他 shell 脚本)的目录中。

编辑:嗯,“ldconfig -nN”。可以正常工作,但我还需要没有在“.so”之后附加库的主要编号的链接,至少是其中一个库,因为一个或多个库是来自 Java 的 JNI 调用的入口点,所以当一个库通过 System.loadlibrary("libraryname") 实例化它需要一个名为“libraryname.so”的库,而不是“libraryname.so.X”。

如果有针对 Java 部分的解决方法,那么仅使用 ldconfig -nN 的解决方案就可以工作。

0 投票
2 回答
7304 浏览

tfs - 如何在团队基础服务器源代码控制结构中处理共享项目

在阅读了 Team Foundation Server 源代码控制结构之后,我想到了几个问题,我想知道是否有人可以发表评论。

我有几个组成我正在从事的项目的组件。我有一个智能客户端、一个网络服务、一个智能客户端使用的网络服务代理、一个守护进程和一个在智能客户端和网络服务中都使用的通用实用程序库。每个组件都与同一个工作项目相关。

我已经构建了我的源代码树,以便每个组件都是独立的 - 换句话说,每个组件(智能客户端、Web 服务、守护程序、代理、常用实用程序)都有自己的主干和自己的解决方案文件,因为我希望能够发布每个组件独立。对于其他组件使用的组件,例如在 smartclient 使用代理和通用实用程序的情况下,我创建了像任何其他 3rd 方库一样处理的版本(引用二进制文件而不是项目)。任何人都可以确认这在某种程度上是一个最佳实践,如果不是,否则应该如何做?

我一直在使用 tfs build 构建我的组件的版本,我想知道如果除了所有 tf​​s 构建所在的构建输出目录之外的任何地方,我应该将这些版本放在哪里。我是否应该将它们(例如智能客户端使用的代理发布程序集)与任何其他第 3 方库一起检查到 TFS 中,然后将发布程序集分支到要使用它们的位置(例如,将代理发布 dll 分支到智能客户端 lib 目录) ?

0 投票
4 回答
4134 浏览

java - 在 Linux 上使用 Bundle-NativeCode 不起作用

我创建了一个包含以下文件夹结构的插件:

  • 源代码
  • 本机/so/libsystemcommand.so
  • 元信息/清单.MF

清单包括命令

build.properties 看起来像

在我Activator上课的开始方法中,我打电话

在运行时找不到库并抛出UnsatisfiedLinkError 。

我必须在插件中设置更多属性吗?我是否必须在目标平台上解压缩一些信息?

编辑:

0 投票
1 回答
245 浏览

c++ - 共享库发现

我在 Linux 上使用 C++。我想动态绑定一组未知共享库。我需要我的代码来检测共享库公开的所有公共函数以及这些函数的字符串名称。我如何完成这项任务?

0 投票
3 回答
24198 浏览

shared-libraries - 使用 dlopen 加载库时收到“未定义符号”错误

我正在编写一些使用动态共享库作为插件的代码。

我用于构建共享库的命令行如下所示:

在模块中,我可以调用在主可执行文件中加载的任何其他共享库中的函数。

但是我无法访问(导出)可执行文件本身的函数(我收到undefined symbol错误)。

我的电话dlopen看起来像这样:

谁能告诉我的模块如何回调我的可执行文件,而不必将所有可执行文件的实用程序功能放入另一个共享库中?

0 投票
21 回答
1454189 浏览

linux - 加载共享库时的 Linux 错误:无法打开共享对象文件:没有这样的文件或目录

程序是 Xenomai 测试套件的一部分,从 Linux PC 交叉编译到 Linux+Xenomai ARM 工具链。

编辑:好的,我没有注意到末尾的 .1 是文件名的一部分。这到底是什么意思?

0 投票
4 回答
22039 浏览

c++ - 使用 g++ 编译动态共享库

我正在尝试使用 g++从Program-Library-HOWTO编译以下简单的 DL 库示例代码。这只是一个示例,因此我可以学习如何使用和编写共享库。我正在开发的库的真实代码将用 C++ 编写。

如果我用 gcc 编译程序,它工作正常。

当我将文件名和编译器更改为以下

我收到以下错误:

foo.cpp:16:错误:从 'void*' 到 'double (*)(double)' 的无效转换

我理解(我我理解,如果这是错误的,请纠正我)我不能从 C++ 中的 void 指针进行隐式转换,但是 C 允许我,这就是为什么上面的代码将使用 gcc 编译但不使用克++。所以我通过将上面的第 16 行更改为:

有了这个,我收到以下错误:

foo.cpp:16: 错误:不能在赋值中将 'double*' 转换为 'double (*)(double)'

这些问题可能更多地与我自己对适当的 C++ 编码标准的普遍无知有关,而不是其他任何事情。谁能给我指出一个关于使用 C++ 示例代码为 Linux 开发动态库的好教程?

0 投票
5 回答
17324 浏览

c++ - g++:静态库和动态库应该以什么顺序链接?

假设我们有一个名为“my_app”的主可执行文件,它使用了其他几个库:3 个库是静态链接的,另外 3 个是动态链接的。它们应该按什么顺序与“my_app”相关联?

但是这些应该以什么顺序联系起来呢?

假设我们得到了依赖于 libSB 的 libSA(如在静态 A 中)和依赖于 libSB 的 libSC:

和三个动态库:(libDA -> libDB -> libDClibDA基本的,libDC是最高的)

这些应该按什么顺序链接?基本的第一个还是最后一个?

似乎是正确的顺序,但是这样吗?如果任何动态库与静态库或其他方式之间存在依赖关系怎么办?