zoukankan      html  css  js  c++  java
  • GCC 静态库和动态库

    转自GCC 静态库和动态库


    //hello.c
    #include 
    
    void print_hello()
    {
    	printf("HelloWorld ");
    }
    
    //main.c
    #include
    #include "hello.h"
    
    int main()
    {
    	print_hello();
            printf("%d",HELLO);
    	return 0;
    }
    
    //hello.h
    #define HELLO 9999
    void print_hello();
    

    其中 hello.c 和 main.c 在同一个目录下, hello.h在上一个目录。

    先生成 xxx.o 文件
    $ gcc hello.c -c ==> hello.o
    $ gcc main.c -c ==> error : no hello.h
    $ gcc main.c -c -I ../ ==> main.o -I 指定头文件的搜索目录( I 是大小的 i)
    $ ls ==> hello.o main.o hello.c main.c


    静态库的生成

    $ ar cr libhello.a hello.o ==> libhello.a (注意顺序)

    静态库的使用

    $ gcc main.o -o main.out -lhello==> error : /usr/bin/ld: cannot find -lhello,意思是找不到库 -l 是小写的L

    1.linux下默认gcc搜索是按照LD_LIBRARY_PATH来搜索的,标准库(动态库和静态库)都在 /usr/lib/ 下面

    2.-lhello是一种约定,表示搜索 libhello.a 或者 libhello.so 的库,-lXXXX 即 libXXXX.a 或者 libXXXX.so

    3. 可以用 -L 来指定加载库的目录

    $ gcc main.o -o main.out -L . -lhello ==>出现了main.out,成功!

    静态库的测试

    $ rm libhello.a -f ==>程序照样能运行,说明静态库是链接进程序的!


    动态库的生成

    $ gcc hello.o -o libhello.so -shared ==> libhello.so

    动态库的使用

    $ gcc main.o -o main.out -L . -lhello ==> -L指定库所在路径-lhello指定libhello.a 或者 libhello.so

    $ ./main.out ==> error while loading shared libraries: libhello.so: cannot open shared object file: No such file                    or directory

    动态链接库是在程序运行时候去加载的,加载的时候是从标准目录/usr/lib下去寻找的,下面是三种解决方法

    1. $ cp libhello.so /usr/lib/ ==> libhello.so拷贝到/usr/lib/下去

    2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

    // export LD_LIBRARY_PATH=$LD_LIBRARY_PATH : <path of libxxxx.so>

    3 . /etc/ld.so.conf 里面加一行所在库的目录,然后执行 ldconfig

    /etc/ld.so.conf文件:除了标准目录(/lib和/usr/lib)之外,链接器和加载器搜索共享库时要检查的其他目录,和这个文件相关的一个命令是:ldconfig

    动态库的测试

    $ rm libhello.so ==>运行的时候出错,说明程序运行的时候需要库!


  • 相关阅读:
    MySQL模糊匹配查询like、regexp、in
    MySQL数据库——表操作
    (转)MySQL join语法解析与性能分析
    (转)解决 TortoiseGit 诡异的 Bad file number 问题
    四、windows下TortoiseGit的使用与操作
    (转)创建GitHub技术博客
    二、Windows下TortoiseGit的安装与配置
    三、TortoiseGit之配置密钥
    集训之6-26模拟赛一
    集训之各种dp
  • 原文地址:https://www.cnblogs.com/noble/p/4144006.html
Copyright © 2011-2022 走看看