linux 下编译生成静态库和动态库

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhouguangcai8/article/details/79624505

我们此处为了说明静态库和动态库的编译,会使用示例代码。创建  test.h, hello.cpp 和 world.cpp, 在两个源文件中分别实现两个函数( 此处都是示例代码,文件命名不规范,理解意思即可 )。

test.h (静态库头文件)

#ifndef _TEST_
#define _TEST_
void hello();
void world();
#endif

hello.cpp:

#include <iostream>
#include "test.h"
using namespace std;
void hello()
{
    cout << "this is hello" << endl;
} 

world.cpp:

#include <iostream>
#include "test.h"
using namespace std;
void world()
{
    cout << "this is world" << endl;
} 

静态库编译:

    linux 下静态库的命名规则为  lib+库名+.a

    1、首先将源文件夹编译成目标文件 ( hello.o, world.o )

    g++ -c hello.cpp world.cpp

         注意 -c 参数是必须带,生成目标代码(机器代码),如果不带该参数,则是编译链接,由于没有main   函数,编译时会报错。编译完成之后生成 hello.o 和 world.o

    2、用ar 工具将目标文件打包成 .a 静态库  ( libtest.lib )   

    ar -crv libtest.lib hello.o world.o

动态库编译:

    linux 下动态库的命名规则为 lib+库名+.so

    1、生成目标文件(hello.o  world.o),此时需要加编译器 选项 -fpic

    g++ -fpic -c hello.cpp world.cpp

    2、生成动态库, 

    g++ -share -o libtest.so hello.o world.o

   也可以将上面两步合并为一步

    g++ -fpic -share -o libtest.so hello.pp world.cpp

   如果生成的动态库不在 /lib 或者 /usr/lib 目录下,则需要将动态库的路径添加到 /etc/ld.so.cache 文件中,只有这样程序在运行时才能找到动态库, 添加步骤如下:

    1、编辑 /etc/ld.so.conf 文件,将动态库路径加入该文件

    2、调用 ldconfig 命令,重建 /etc/ld.so.cache 文件。

更为专业的生成动态库方式如下:

g++ -shared -Wl, -soname, libtest.so.1 -o libtest.so.1.10 hello.o world.o

   编译完成之后生成 libtest.so.1.10 库文件,这是库的 realname

    此时还需要将库路径添加入 /etc/ld.so.conf 中,然后 ldconfig -v 命令更新配置文件

    更新完之后,生成了 libtest.so.1 文件,是库的 soname   (运行时的时候用 soname,只记录主版本号,检查主版本是否正确) 

    调用如下命令,生成 linkname (linkname 在编译链接阶段使用,方便 makefile)

        ln -s libtest.so libtest.so.1.10


动态库和静态库的调用

    动态库和静态库的调用方式相同, 以 main.cpp 中调用库函数说明:

    g++ -o main.exe main.cpp -L . -ltest

    其中 -L 选项指明库函数的位置

    -ltest 为库名的缩写,只有完全按照linux 库命名规则命名的库才能采用缩写。全名为 libtest.a 或 libtest.so

    
展开阅读全文

没有更多推荐了,返回首页