首页 > 编程语言 >【c&c++】如何创建动态库

【c&c++】如何创建动态库

时间:2022-11-17 14:00:15浏览次数:44  
标签:文件 gcc 创建 c++ so libb 动态 链接

静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。

而依赖动态库的程序其实也有链接动态库的阶段,只不过这个链接并不是真正的将动态库链接到程序中,其目的是告诉程序,所依赖的到底是哪个动态库。

静态库有点类似于将静态库复制到程序中,而动态库是在程序中创建一个软连接。

比如:

//a.c  主程序源代码
#include <stdio.h>
#include "b.h"
main(){
bb();
}

//b.h 主程序依赖b库,b库的头文件是b.h
int a;
void bb(void);

//b.c b库源代码
#include <stdio.h>
#include "b.h"
int a=7;
void bb(){
printf("das%d\n",a);
}

首先生成动态库:

       第一步:生成b.o目标文件,使用如下命令。在此处需要添加-fPIC参数,该参数用于生成位置无关代码已工生成动态库使用,使用命令:gcc -c -o b.o -fPIC b.c

  第二步:使用-shared参数生成动态库,使用如下命令:gcc -shared -o libb.so b.o,

       不过上述两部可以连在一起,:gcc -shared -fPIC -o libb.so b.c

 

接下来就是将程序文件a.c链接动态库生成二进制可执行程序的过程了,这里有很多方法:

方法一:如果将libb.so移动到/lib64;/usr/lib64;这两个任意目录下,直接用命令gcc -o a a.c -lb,则链接成功,

 

但是不提倡用这个方法,因为是我们自己编写的库文件,/lib;/usr/lib64这两个文件夹下都是些系统的库文件,所以还是不要碰这两个文件夹了

方法二:我们先在本地目录下生成动态库文件,然后将本目录加入到系统搜索动态库文件的环境变量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH)(事实上动态库的环境变量不只这一个,还有LD_PRELOAD,详见其他博客),然后再执行gcc -o a a.c -L. -lb

 

方法三,指定动态文件的位置,比如gcc -o a a.c /root/libb.so;gcc -o a a.c ./libb.so

一旦指定了动态文件的位置,动态文件将不能移动。以下通过gcc -o a a.c ./libb.so举例(我本人推荐此方法):

gcc -o a a.c ./libb.so

 

 在方法三中,链接时已经明确了动态库的位置,所以如果移动动态库,甚至将动态库移动至/lib64目录下,或者将主程序a移动至其他目录,都将导致程序运行失败,只要保证动态库与可执行程序保持在同一文件夹下才有效

 

标签:文件,gcc,创建,c++,so,libb,动态,链接
From: https://www.cnblogs.com/opensmarty/p/16899264.html

相关文章

  • 【c&c++】 -fpic 与-fPIC的区别
        在编译动态库的时候,我们应该需要使用-fpic或-fPIC参数。pic与PIC的异同相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址......
  • c——动态数组
    #include<stdio.h>#include<string.h>typedefstructtest_stest_t;structtest_s{inta;intb;chararr[0];};intmain(){test_t*t;......
  • Oracle 创建表 练习题
     a)      建立下列教学管理用的数据表。注意,表名和字段名都是英文。学生表(student)字段名称数据类型约束学号S_NOCHAR(6)主键姓名......
  • Oracle创建用户和授权
    在OracleXE中创建scott用户1、打开SQL*Plus,以sys用户登录数据库connect/assysdba2、依次执行下面命令--DROPUSERscottCASCADE;CRE......
  • 【C++高级编程】(二)设计专业的C++程序
    本章内容:程序设计的定义程序设计的重要性C++程序设计的特点高效C++程序设计的两个基本主题:抽象以及重用不同类型的重用代码代码重用的优缺点重用代码的常用策略及......
  • c++多线程thread用法小例子
    测试分布式存储系统时,针对并发测试,同时创建500个文件,采用这种方法。#include<iostream>#include<thread>usingnamespacestd;voidproc(inta){cout<<"子线......
  • 创建并实现HelloController类
    packagecom.tedu.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;如果Controller类......
  • Day7-3 类与对象的创建
    类与对象的创建类与对象的关系类是一种抽象的数据类型,他是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物动物,植物,手机,电脑。。。。。。Person类、Pe......
  • C++ Tips:static const size_t nops、string substr、upper_bound、find()
    维基百科连接......
  • C/C++学生综合测评系统
    C/C++学生综合测评系统项目十六学生综合测评系统(2周)[目的要求]学生根据所学的程序设计基础原理与程序设计的知识,能够针对-一个小型的程序设计基础管理系统,进行系统的......