【基础】gcc-动态库和静态库的创建和使用-命令

news2024/10/7 10:22:43

目录

  • 1 动态库的建立使用
  • 2 动态库封装过程
    • 2.1 编译动态库
    • 2.2 使用动态库
    • 2.3 命令参数说明
  • 3 静态库封装过程
    • 3.1 静态库的封装
    • 3.2 静态库的使用

1 动态库的建立使用

 首先建立一个头文件,和三个.cpp文件,目的是要把这些文件链接成动态库:
在这里插入图片描述
其中:四个文件中的内容分别是:

  • so_test.h
#include <stdio.h>
void test_a();
void test_b();
void test_c();
  • test_a.cpp
#include "so_test.h"
void test_a()
{
   printf("Test_a\n");
}
  • test_b.cpp
#include "so_test.h"
void test_b()
{
   printf("Test_b\n");
}
  • test_c.cpp
#include "so_test.h"
void test_c()
{
   printf("Test_c\n");
}

 再建立一个测试文件:test.cpp

  1. test.cpp
#include "so_test.h"
#include <string.h>
int main()
{
   test_a();
   test_b();
   test_c();
   getchar();
   return 0;
}

此时如果运行: g++ test.cpp -o test,会出现错误,如果要形成编译文件:实际应该按照下面命令:g++ test.cpp test_a.cpp test_b.cpp test_c.cpp -o test,这样能编译通过,但是后面项目中如果这些文件使用频繁,那么每次这样输入就是显得很繁琐,尤其是当编译文件非常多的时候。
所以可以把:test_a.cpp test_b.cpp test_c.cpp三个文件封装成一个动态或者静态链接库,下面是封装过程:

2 动态库封装过程

2.1 编译动态库

  1. 将这几个文件编译成一个动态库:libtest.so
    g++ test_a.cpp test_b.cpp test_c.cpp -fpic -shared -o libmylib.so
    动态库命名规则:链接
    这样就会在自己的文件目录下生成一个文件:
    在这里插入图片描述

2.2 使用动态库

  1. 使用动态库:libtest.so
    g++ test.cpp -L. libmylib.so -o test
    会生成可执行文件:
    在这里插入图片描述

2.3 命令参数说明

  1. gcc动态库生成参数说明:
    最主要的是GCC命令行的一个选项:
    -shared—该选项指定gcc编译器生成动态连接库,而不是可执行文件
    -fPIC—表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。正是使用这个,使得动态链接库不用再编译时拷贝库函数的完整代码,实现真正的动态链接。
    -L.—指定编译的时候动态链接库的位置,这里使用 -L. 后面跟了一个点表示要连接的库在当前目录中
    //下面的暂时不用看
    (4)-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
    另外:
    (1)LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
    (2)当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

3 静态库封装过程

3.1 静态库的封装

使用 g++ 生成静态库的命令通常如下:

g++ -c source_files -fPIC
ar rcs liblibrary_name.a object_files

在本文中命令就是:
g++ -c test_a.cpp test_b.cpp test_c.cpp
ar rcs libmylibray.a test_a.o test_b.o test_c.o
其中:

  • -c 选项用于只进行编译,生成目标文件。
  • -fPIC(位置无关代码)选项,以便生成的代码可以用于创建共享库。
  • source_files 是你的源文件。
  • object_files 是编译生成的目标文件。
  • liblibrary_name.a 是生成的静态库的名称。

首先,使用 -c 编译源文件,然后使用 ar 工具将目标文件打包成静态库。

3.2 静态库的使用

在使用静态库时,一般需要以下步骤:

  1. 编译生成静态库。
  2. 在其他代码中使用静态库,常见的命令如下:
g++ main_source_file.cpp -Lpath_to_static_library -lstatic_library_name

其中:

  • main_source_file.cpp 是你的主源文件。
  • -Lpath_to_static_library 指定静态库所在的路径。
  • -lstatic_library_name 指定要使用的静态库的名称。

这样编译后,就会将静态库中的代码链接到你的程序中。
例如在本次里面要进行的命令就是:
g++ test.cpp -L. libmylibray.a -o test;
会生成一个可执行文件:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++数组的创建、初始化、传参

C数组创建 静态数组&#xff1a;填入具体的大小 type arrayName [arraySize];动态数组&#xff1a;在运行时分配内存。 int* arrnew int[5]; //当程序使用完new分配的内存时&#xff0c;应使用delete释放他们 delete []arr;用标准库容器&#xff1a;std::vector 可以动态增长…

Python 异常处理深度解析:掌握健壮代码的关键

文章目录 1. 异常处理的基础1.1 使用 try 和 except1.2 捕获多种异常 2. 高级异常处理2.1 捕获所有异常2.2 使用 else 和 finally 3. 异常链与自定义异常3.1 异常链3.2 自定义异常 有效管理和处理异常是构建健壮、可靠和用户友好应用程序的基石。异常处理不仅有助于防止程序意外…

衣康酸(ITA)应用领域广泛 工业发酵法为其主流制备方法

衣康酸&#xff08;ITA&#xff09;应用领域广泛 工业发酵法为其主流制备方法 衣康酸&#xff08;ITA&#xff09;又称亚甲基丁二酸、甲叉琥珀酸&#xff0c;化学式为C5H6O4&#xff0c;是一种不饱和二元有机酸。衣康酸外观呈白色结晶粉末&#xff0c;含强烈刺激性气味&#xf…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

看现货白银平台测评要注意的几个事项

在网上我们会看到很多现货白银平台测评的文章或短视频&#xff0c;我们要注意&#xff0c;这些测评内容包括本文在内&#xff0c;多少都会存在着一些主观性的东西&#xff0c;这是无可避免的。不过在看现货白银平台测评时&#xff0c;有一些客观的东西&#xff0c;是需要我们留…

专注底层技术创新,超高性能公链新星 Sui Network 有何独特优势?

近年来&#xff0c;Sui Network 为了能够打造让开发者低成本实现广泛应用开发的公链环境付诸实际行动。其建立了以对象为中心的数据模型、在交易签名和 PTB 中实现精细化权限、优化用户友好功能&#xff0c;逐步为开发者和用户提供了一个更为灵活、安全的链上运行环境。在优越技…

【吊打面试官系列】Java高并发篇 -为什么使用 Executor 框架比使用应用创建和管理线程好?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 为什么要使用 Executor 线程池框架 1、每…

springboot 载入自定义的yml文件转DTO

改进方法&#xff0c;直接spring注入 import cn.hutool.json.JSONUtil; import org.springframework.beans.factory.config.YamlMapFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import …

开抖音小店需要用到哪些软件?全部都给大家整理好了,快来看看!

哈喽~我是电商月月 在抖音小店的运营过程中&#xff0c;选品上架&#xff0c;售后客服都是要靠软件辅助进行的 那开抖音小店到底会用到哪些软件&#xff1f;这些平台都叫什么&#xff1f; 今天我就给大家介绍一下抖音小店运营过程中会使用到的软件&#xff0c;干货满满&…

图片/视频上传(超简单教程)

#应用场景# 该后端开发接口适用 图片/视频上传&#xff0c;返回路径名称场景 1.视频上传 写在Controller层 这里只是一个接收&#xff0c;调用uploadObject方法上传oss public OmsResult<FileUploadDto> goodsUploadVideo(RequestParam(value "file") Mu…

SQL优化——执行计划

文章目录 1、获取执行计划常用方法1.1、使用AUTOTRACE查看执行计划1.2、使用EXPLAIN PLAN FOR查看执行计划1.3、查看带有A-TIME的执行计划1.4、查看正在执行的SQL的执行计划 2、定制执行计划3、怎么通过查看执行计划建立索引4、运用光标移动大法阅读执行计划 SQL执行缓慢有很多…

ubuntu环境下使用g++把c++编译成汇编语言(暂时)

1. 引言 为了深入理解c&#xff0c;决定学习一些简单的汇编语言。使用ubuntu系统下g很容易将一个c的文件编译成汇编语言。本文使用此方法&#xff0c;对一个简单的c文件编译成汇编语言进行理解。 2.示例 文件名&#xff1a;reorder_demo.cpp #include<stdio.h>typede…

【网络运维知识】—路由器与交换机区别

【网络运维知识】—路由器与交换机区别 一、路由器&#xff08;Router&#xff09;和交换机&#xff08;Switch&#xff09;对比1.1 功能1.2 转发方式1.3 范围1.4 处理方式 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 路由器&#xff08…

MySQL8.0 一主二从

1. 系统环境 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)192.168.183.137 mysql-master 192.168.183.153 mysql-slave-1 192.168.183.154 mysql-slave-2# 关闭SELINUX sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config seten…

基于SpringBoot的幼儿园管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7 数据表&#xff1a;16张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;html 后端技术&#xff1a;SpringBoot 功能简介 项目获取关键字&#xff1a;幼儿园 该…

React-css-in-js技术

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-css-in-js技术 目录 1、简介 2、定义样式与使用 3、样式继承 4、属性传递 1、简介 …

买婴儿洗衣机怎么选择?四大绝佳好用婴儿洗衣机分享

幼龄时期的宝宝的衣物&#xff0c;是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察&#xff0c;然后在宝宝洗衣服的这上面多下点功夫&#xff0c;不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

IP地址怎么实现https

IP可以申请SSL证书。可以解决企业需要对IP实现https加密的需求&#xff0c;一张证书可以支持同时绑定多个IP。 IP证书有两种级别&#xff1a;基础级IP SSL证书和标准企业级IP SSL证书。 基础型SSL证书只需要10-30分钟即可颁发&#xff0c;企业型需要1-3个工作日即可颁发。 企…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

deepspeed笔记

文章目录 一、deepspeed是什么&#xff1f;二、能训多大的模型&#xff0c;耗时如何&#xff1f;三、RLHF训练流程四、通信策略 一、deepspeed是什么&#xff1f; 传统的深度学习&#xff0c;模型训练并行&#xff0c;是将模型参数复制多份到多张GPU上&#xff0c;只将数据拆分…