1.) STD 库是共享库还是什么?
我不知道。也可以是。大概两者兼而有之。有关系吗?除非您正在处理一些非常奇特的东西,例如用于系统重建的独立静态链接二进制文件,只要编译器/系统知道如何链接它,您就不太可能关心它。
简而言之,代码可以位于静态库中,在这种情况下,它会链接到最终(编译/生成的)可执行文件中,并且这些二进制文件可能会变得非常大。或者它可以在共享库中,在这种情况下,库是动态加载的,并且多个应用程序可以(理论上)共享一个公共内存映像。除非您正在做一些非常大的事情,并且将在多个应用程序之间共享,否则我会质疑使用共享库的智慧。额外的头痛,尤其是调试头痛,很少值得。如果没有多个同时运行的应用程序,就没有任何节省...
要制作静态库,我会将一堆文件编译成目标文件...而不是使用 ar 和 randlib em>。例如:
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 的顺序很重要!它确定哪些库可以调用其他库中的函数/方法。循环依赖是BAD!
关于 foo1.o foo2.o 文件到 ar,顺序没有区别。
动态库...
前段时间,在一个古老的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++、ls、 等命令时,我确实 NOT 想要设置 LD_PRELOAD >cd 等,因为我正在拦截系统调用。)
(仅供参考:strace 玩起来也很有趣...您还应该看看 ldd和 nm。)
您可能需要查看 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