当我探索开源时,我多次看到这个库(armeabi).
我在网上搜索了它的解释,但我找到的所有结果都是关于它而不是定义它.
这个armeabi是什么?为什么他们在Android应用程序中使用它?
有一台笔记本电脑,我没有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?
它引入了静态/共享/动态加载库,以及一些使用它们的示例代码.
在为本机平台开发时,我可以使用ldd列出所有共享库(.so文件)我构建的二进制可执行文件将在启动时尝试加载.但是当交叉编译时,我不知道如何获得相同的信息.这ldd不是一个普通的binutils实用程序,比如strip或者ar,可以和gcc交叉编译一起构建,但相反,它是一个神秘的shell脚本,显然只能在本机平台上运行.
那么,使用跨目标binutils工具,有没有办法获得外部二进制文件的动态链接依赖项列表?
我知道全局变量很糟糕.
但是,如果我使用节点的模块"UTIL"在我的框架40个文件,是不是更好,只是声明它像一个全局变量:
util = require('util');
Run Code Online (Sandbox Code Playgroud)
在index.js文件而不是在40个文件中写入该行?
因为我经常在每个文件中使用相同的5-10模块,这将节省大量的时间,而不是复制粘贴所有的时间.
在这种情况下DRY不好吗?
被/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) 我正在尝试将静态库链接到共享库,我收到了以下错误
/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
unzip log4cplus-1.1.0.zip./configure --enable-static=yes …如何使用类似的东西来判断objdump是否已经构建了一个目标文件-fPIC?
我在tomcat/webapps文件夹下有两个应用程序.
tomcat/webapps/App1
tomcat/webapps/App2
Run Code Online (Sandbox Code Playgroud)
两个应用程序共享相同的库.例如存储在哪些中tomcat/webapps/App1/WEB-INF/lib.
两个库都在内存中加载了两次吗?
我应该把这些共享库放进去tomcat/server/lib吗?
我有一个与另一个(第三方)共享库链接的共享库.然后在我的应用程序中使用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) 我有以下布局:
top_project
+ subproject1
+ subproject2
Run Code Online (Sandbox Code Playgroud)
每个subproject1并subproject2创建一个静态库.我想在这个top_project级别的单个共享库中链接这些静态库.
我到目前为止收集的信息是:
-fPic(除了Windows之外的所有内容)进行编译以创建与位置无关的代码,这将允许将静态库链接到单个共享库或解压缩所有静态库(例如使用ar)并将它们重新链接到共享库(其中我认为这是一个不优雅和不便携的解决方案)add_library命令:由于某些我无法理解的原因,简单地写入add_library(${PROJECT_NAME} SHARED subproject1 subproject2)不能按预期工作(它实际上创建了一个空库并且没有正确地注册依赖项)有什么想法吗?