简单的共享库

  1. STD库是共享库还是什么? 出于好奇。
  2. 有没有任何书籍详细描述共享,静态库的发展?
  3. 有教程吗?

PS(我使用netbeans,eclipse,anjuta)和教程是没有用的,因为我试图了解到底是怎么回事。

在我的平台(Ubuntu Maverick)上是这样的:

g++ test.cpp ldd a.out linux-vdso.so.1 => (0x00007fffee1ff000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f18755fd000) libm.so.6 => /lib/libm.so.6 (0x00007f187537a000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f1875163000) libc.so.6 => /lib/libc.so.6 (0x00007f1874de0000) /lib64/ld-linux-x86-64.so.2 (0x00007f1875920000) 

注意上面的libstdc ++。so.6。

用cmake创建一个共享库是很容易的。

1.安装cmake 2.6或更高版本。

2.用您的库的代码创建一个文件test.cpp。

3.创建一个文件CMakeLists.txt:

 cmake_minimum_required(VERSION 2.6) project(TEST) add_library(test SHARED test.cpp) 

4.运行cmake来创建一个makefile:

 cmake -G "Unix Makefiles" 

5.运行make来建立你的共享库。

使用CMake,您还可以使用以下命令生成Eclipse CDT项目

 cmake -G "Eclipse CDT4 - Unix Makefiles" 

您也可以在这里找到有关这个主题的有趣文章。

1.)STD库是共享库还是什么?

我不知道。 可能是。 可能都是。 有关系吗? 除非你正在处理一些像独立静态链接的二进制文件那样的非常奇怪的东西来进行系统重建,只要编译器/系统知道如何链接它,你就不可能关心它。


简而言之,代码可以在静态库中,在这种情况下,它被链接到最终(编译/生成)的可执行文件中,并且这些二进制文件可能变得相当大。 或者它可以在共享库中,在这种情况下,库是动态加载的,并且多个应用程序可以(理论上)共享一个共同的内存映像。 除非你正在做一些相当大的事情,并且会在多个应用程序之间共享,否则我会质疑使用共享库的智慧。 额外的麻烦,特别是调试头痛,很少值得。 而没有多个同时运行的应用程序,没有节省…


为了创建一个静态库,我将一堆文件编译成目标文件…比使用arrandlib 。 例如:

 g++ -c foo1.C -o foo1.o g++ -c foo2.C -o foo2.o ar -rv libfoo.a foo1.o foo2.o ranlib libfoo.a 

随后,我只需将该库链接到:

 g++ testfoo.C -o testfoo -L. -lfoo 

请注意,如果您正在使用多个库,那么(g ++ testfoo.C)命令行上的-lbar1 -lbar2顺序很重要! 它确定哪些库可以调用其他库中的函数/方法。 循环依赖是坏的

对于foo1.o foo2.o文件来说,排序没有区别。


动态库…

前一段时间,在一个古老的fedora core 3系统下,我在Linux下玩弄共享库。 那么,我会编译我的共享库,如fooLibrary.c ,与:

 g++ -shared -Wl,-soname,libfooLibrary.so.1 -o libfooLibrary.so.1.0 -fPIC fooLibrary.c -ldl 

那时我正在玩LD_PRELOAD,所以我有一个脚本来运行我的程序,

 export LD_PRELOAD=libfooLibrary.so ; export LD_LIBRARY_PATH=. ; ./myTestProgram 

(请注意,当我拦截系统调用时,我不想在运行像g ++lscd等命令时设置LD_PRELOAD 。)

(仅供参考: strace玩起来也很有趣…您还应该查看lddnm 。)

你可能想看看像dlopen()dlsym() – 用于手动访问动态库…

哦,环境变量LD_LIBRARY_PATH将目录添加到动态库的默认搜索路径中。

(关于调试,让我来提一下,当我截获malloc()时 ,我发现dlopen()/ dlsym()里的某个地方是对malloc()的调用,这意味着我需要使用malloc加载提供了真正的malloc()的库。调试那个…的乐趣…)


PS还有一个想法:您可能想要查看gcc / g ++的命令行选项。 那里有很多有用的信息

http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/index.html#toc_Invoking-GCC