我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local /
lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my-
app应该仅与libabc.so链接。我怎样才能做到这一点?
提前致谢。我正在使用g ++编译器
假设libabc.so
从位置独立的目标代码文件abc1.pic.o
和获得abc2.pic.o
;那么你已经用例如
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
然后libabc.so
用
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
我-L/usr/local/lib
之前 添加-l123
是因为我假设您有一个/usr/local/lib/lib123.so
共享库。
另请阅读程序库HowTo。
如您所见,您可以将共享库链接lib123.so
到您自己的共享库中libabc.so
然后检查 ldd libabc.so
您可能要设置一些rpath的在你的libabc.so
加入-Wl,-rpath
,并-Wl,$RPATHDIR
以链接命令。
有关更多详细信息,请阅读Drepper的论文
如何编写共享库
PS。不要使用静态库lib123.a
(应该是PIC)。如果将非PIC代码链接到共享库中,则会失去共享库的大部分优点,因此动态链接程序ld.so必须进行数百万的重定位。
我试图将我编译的简单共享库(libhello.so)链接到我的本机C++代码中。库libhello.so文件是: 1。Get13.h 2.get13.cpp Android文件是: 1。myapplication/jni/android.mk 问题是,在gradle构建过程中,我在文件native-lib.cpp中得到了这个错误: 我使用android NDK包中包含的make_standalon
问题内容: 最近,我们被要求提供其中一个库的Linux版本,之前我们是在Linux下开发的,并已针对Windows发行,而在Windows上部署库通常要容易得多。我们遇到的问题是将导出的符号剥离为仅暴露界面中的符号。想要这样做的三个很好的理由 为了保护我们技术的专有方面,以免通过导出的符号被暴露。 防止用户遇到符号名称冲突的问题。 为了加快库的加载速度(至少有人告诉我)。 然后举一个简单的例子:
库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法— 即,从模块中构建程序。Linux支持两种类型的库,每一种库都有各自的优缺点。静态库包含在编译时静态绑定到一个程序的函数。动态库则不同,它是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的。 使用共享库的方法有两种:您既可以在运行时动态链接库,也可以动态加载库并在程序控制之下使用它们。本
我正在尝试链接一个名为libtest lib的预编译共享库文件。所以这是我在CMakeLists的底部所拥有的。txt: 如上所述,我得到以下错误: 如果我注释掉add_library行,我会得到以下结果: 在库中链接时,似乎绝对需要源文件(.c、cpp等)。但我如何在一个。那档案呢?这些文档对target_link_库()做了如下介绍: 被命名的必须是由add_executable()或add_
问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到
问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)