zoukankan      html  css  js  c++  java
  • Linux命令(十二)制作静态库和共享库

    1. 静态库

    • 静态库文件命名:libxxxx.a

    1.1 步骤:

    ar rcs libCalc.a *.o  

    1.2 用nm查看文件内容

    1.3 发布并使用

    gcc main.c -o mycpp.out -I include/ -L lib/ -lCalc

    注意: -L:包含库路径, -l:指定库名(通常是 -lmylib (库名为libmylib.a)) 

    2. 动态库

     

    1. 编译与位置无关的代码,生成.o

    gcc -fPIC -c *.c -I ../include/

    注意:这些 *.o文件 与位置无关

    2. 将.o文件打包: 关键参数 shared

    gcc -shared -o libCalc.so *.o

    3. 发布库文件和头文件

    gcc main.c -o newapp.out -I include/ -L lib/ -lCalc

    此时虽然编译好了,但是无法使用

    解决:

    1. 拷贝到下面目录

    2.  创建软链接

    sudo ln -s /tmp/Douzi/calc/lib/libmyCalc.so /lib/libmyCalc.so

    3. 改变环境变量

    或者:

    sudo ldconfig -v

    永远生效则修改 .config

     3. 动态库补充 -soname

    http://www.voidcn.com/article/p-ohvkibsz-y.html

     https://www.cnblogs.com/skynet/p/3372855.html

    3.1 g++(gcc)编译选项

    • l  -shared :指定生成动态链接库。

    • l  -static :指定生成静态链接库。

    • l  -fPIC :表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码, 念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。

    • l  -L. :表示要连接的库所在的目录。

    • l  -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。

    • l  -Wall :生成所有警告信息。

    • l  -ggdb :此选项将尽可能的生成gdb 的可以使用的调试信息。

    • l  -g :编译器在编译的时候产生调试信息。

    • l  -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件

    • l  -Wl, options :把参数(options)传递给链接器ld 。如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。

    3.2 nm命令

    • 有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种:

    • l  一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;

    • l  一种是库中定义的函数,用T表示,这是最常见的;

    • l  一种是所谓的弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。

    • $nm libhello.h

    3.3 ldd命令

    ldd命令可以查看一个可执行程序依赖的共享库,例如我们编写的四则运算动态库依赖下面这些库:

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/douzujun/p/10558241.html
Copyright © 2011-2022 走看看