标签: shared-libraries

什么是armeabi以及他们使用它的原因?

当我探索开源时,我多次看到这个库(armeabi).

我在网上搜索了它的解释,但我找到的所有结果都是关于它而不是定义它.

这个armeabi是什么?为什么他们在Android应用程序中使用它?

android shared-libraries

58
推荐指数
3
解决办法
4万
查看次数

如何在GCC Linux中指定非默认的共享库路径?运行时获取"加载共享库时出错"

有一台笔记本电脑,我没有root权限.

在机器上我安装了一个库configure --prefix=$HOME/.usr.

之后,我收到了以下文件~/.usr/lib:

libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
Run Code Online (Sandbox Code Playgroud)

当我编译一个程序,该程序使用此命令调用库提供的函数之一: gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX

xxx.out是在没有警告的情况下生成的,但是当我运行它时会抛出这样的错误:

./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory,虽然libXX.so.16住在那里.

我的无线假设是~/.usr/lib在调用xxx.out时未搜索到的.但是我可以做些什么来指定.so的路径,以便xxx.out可以查找.so文件?

另外一个是当我-static向gcc提供时,另一个错误发生如下:

undefined reference to `function_proviced_by_the_very_librar'
Run Code Online (Sandbox Code Playgroud)

.so即使-L并且-l给予gcc 似乎也无所谓.我该怎么做才能用该库构建一个可用的exe?


对于与我有同样问题的其他人

在tldp找到了一篇有用的文章.

它引入了静态/共享/动态加载库,以及一些使用它们的示例代码.

linker gcc shared-libraries

56
推荐指数
2
解决办法
11万
查看次数

如何列出非本机二进制文件的库依赖项?

在为本机平台开发时,我可以使用ldd列出所有共享库(.so文件)我构建的二进制可执行文件将在启动时尝试加载.但是当交叉编译时,我不知道如何获得相同的信息.这ldd不是一个普通的binutils实用程序,比如strip或者ar,可以和gcc交叉编译一起构建,但相反,它是一个神秘的shell脚本,显然只能在本机平台上运行.

那么,使用跨目标binutils工具,有没有办法获得外部二进制文件的动态链接依赖项列表?

linux gcc shared-libraries cross-compiling binutils

56
推荐指数
3
解决办法
7万
查看次数

node.js标准模块的全局变量?

我知道全局变量很糟糕.

但是,如果我使用节点的模块"UTIL"在我的框架40个文件,是不是更好,只是声明它像一个全局变量:

util = require('util');
Run Code Online (Sandbox Code Playgroud)

在index.js文件而不是在40个文件中写入该行?

因为我经常在每个文件中使用相同的5-10模块,这将节省大量的时间,而不是复制粘贴所有的时间.

在这种情况下DRY不好吗?

javascript module global-variables shared-libraries node.js

55
推荐指数
4
解决办法
6万
查看次数

/ usr/local/lib是否搜索了共享库?

/usr/local/lib搜索的共享库?我有这个错误:

[Leo@chessman ~]$ whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg
[Leo@chessman ~]$ ffmpeg
ffmpeg: error while loading shared libraries: libavcore.so.0: cannot open shared object file: No such file or directory
[Leo@chessman ~]$ ls /usr/local/lib/libav*
/usr/local/lib/libavcodec.a            /usr/local/lib/libavfilter.a
/usr/local/lib/libavcodec.so           /usr/local/lib/libavfilter.so
/usr/local/lib/libavcodec.so.52        /usr/local/lib/libavfilter.so.1
/usr/local/lib/libavcodec.so.52.108.0  /usr/local/lib/libavfilter.so.1.74.0
/usr/local/lib/libavcore.a             /usr/local/lib/libavformat.a
/usr/local/lib/libavcore.so            /usr/local/lib/libavformat.so
/usr/local/lib/libavcore.so.0          /usr/local/lib/libavformat.so.52
/usr/local/lib/libavcore.so.0.16.1     /usr/local/lib/libavformat.so.52.94.0
/usr/local/lib/libavdevice.a           /usr/local/lib/libavutil.a
/usr/local/lib/libavdevice.so          /usr/local/lib/libavutil.so
/usr/local/lib/libavdevice.so.52       /usr/local/lib/libavutil.so.50
/usr/local/lib/libavdevice.so.52.2.3   /usr/local/lib/libavutil.so.50.36.0
[Leo@chessman ~]$ 
Run Code Online (Sandbox Code Playgroud)

linux linker ffmpeg shared-libraries

55
推荐指数
6
解决办法
9万
查看次数

"重定位R_X86_64_32S反对"链接错误

我正在尝试将静态库链接到共享库,我收到了以下错误

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

但这适用于32位机器而没有任何此类错误.我尝试-fPIC手动将标志添加到Makefile,但也没有解决问题

-whole-archive按照这里的建议尝试了旗帜,但没有成功.

 
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocation R_X86_64_32S against `vtable for log4cplus::spi::AppenderAttachable' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): could not read symbols: Bad value
collect2: ld returned 1 exit status

创建liblog4cplus.a:

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes …

c++ linux shared-libraries static-libraries

54
推荐指数
2
解决办法
9万
查看次数

如果使用-fPIC构建目标文件,我怎么能用objdump之类的东西来判断?

如何使用类似的东西来判断objdump是否已经构建了一个目标文件-fPIC

gcc shared-libraries objdump fpic

53
推荐指数
2
解决办法
3万
查看次数

如果Tomcat位于两个Web应用程序中,它们是否会将相同的库文件加载到内存中两次?

我在tomcat/webapps文件夹下有两个应用程序.

tomcat/webapps/App1
tomcat/webapps/App2
Run Code Online (Sandbox Code Playgroud)

两个应用程序共享相同的库.例如存储在哪些中tomcat/webapps/App1/WEB-INF/lib.

两个库都在内存中加载了两次吗?

我应该把这些共享库放进去tomcat/server/lib吗?

tomcat shared-libraries

51
推荐指数
4
解决办法
7万
查看次数

强制GCC通知共享库中未定义的引用

我有一个与另一个(第三方)共享库链接的共享库.然后在我的应用程序中使用dlopen加载我的共享库.所有这一切都很好(假设文件在正确的路径等).

现在,问题是当我链接我的库时,我甚至不需要指定链接第三方共享库.GCC接受它而不报告有关未定义引用的错误.那么,问题; 我如何强制GCC通知我未定义的引用

如果我将库更改为(临时)可执行文件,则会获得未定义的引用(当不向链接器提供库时).(如果我指定它,工作正常.)

即,完成以下操作:

g++ -fPIC -shared -o libb.so b.o 
g++ -fPIC -shared -o liba.so a.o
g++ -o a.exe a.cpp 
Run Code Online (Sandbox Code Playgroud)

第二行没有给出错误,第三行抱怨未定义的引用.

示例代码:

啊:

class a
{
public:
    void foobar();
};
Run Code Online (Sandbox Code Playgroud)

a.cpp:

#include "a.h"
#include "b.h"

void a::foobar()
{
    b myB;
    myB.foobar();
}

int main()
{
    a myA; myA.foobar();
}
Run Code Online (Sandbox Code Playgroud)

BH:

class b
{
public:
    void foobar();
};
Run Code Online (Sandbox Code Playgroud)

b.cpp:

#include "b.h"

void b::foobar()
{
}
Run Code Online (Sandbox Code Playgroud)

c++ shared-libraries dynamic-linking

50
推荐指数
2
解决办法
4万
查看次数

CMake:如何从子项目的所有静态库创建单个共享库?

我有以下布局:

top_project
    + subproject1
    + subproject2
Run Code Online (Sandbox Code Playgroud)

每个subproject1subproject2创建一个静态库.我想在这个top_project级别的单个共享库中链接这些静态库.

我到目前为止收集的信息是:

  • 使用-fPic(除了Windows之外的所有内容)进行编译以创建与位置无关的代码,这将允许将静态库链接到单个共享库或解压缩所有静态库(例如使用ar)并将它们重新链接到共享库(其中我认为这是一个不优雅和不便携的解决方案)
  • 所有源文件必须明确地给出add_library命令:由于某些我无法理解的原因,简单地写入add_library(${PROJECT_NAME} SHARED subproject1 subproject2)不能按预期工作(它实际上创建了一个空库并且没有正确地注册依赖项)
  • 在CMake中有一个OBJECT库功能,但我不认为它的目的是真正做我想要的.

有什么想法吗?

cmake shared-libraries

50
推荐指数
2
解决办法
4万
查看次数