【问题标题】:Simple shared library简单的共享库
【发布时间】:2010-10-26 17:54:01
【问题描述】:
  1. STD 库是共享库还是什么?出于好奇。
  2. 有没有详细描述共享静态库开发的书籍?
  3. 有教程吗?

p.s(我正在使用 netbeans、eclipse、anjuta)并且教程没有用,因为我试图了解实际发生的情况。

【问题讨论】:

标签: c++ linux shared-libraries


【解决方案1】:

在我的平台(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"

您还可以找到有关该主题的有趣文章以及更多参考资料here

【讨论】:

    【解决方案2】:

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

    我不知道。也可以是。大概两者兼而有之。有关系吗?除非您正在处理一些非常奇特的东西,例如用于系统重建的独立静态链接二进制文件,只要编译器/系统知道如何链接它,您就不太可能关心它。


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


    要制作静态库,我会将一堆文件编译成目标文件...而不是使用 arrandlib 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 玩起来也很有趣...您还应该看看 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

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2016-06-13
      • 2019-02-26
      相关资源
      最近更新 更多