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

目录

  • 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;
会生成一个可执行文件:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#创建背景色渐变窗体的方法:创建特殊窗体

目录 1.让背景渐变色的理论基础 2.让背景渐变色的方法 3.一个实施例 &#xff08;1&#xff09;Form1.Designer.cs &#xff08;2&#xff09;Form1.cs &#xff08;3&#xff09;渐变的蓝色背景 在窗体设计时&#xff0c;可以通过设置窗体的BackColor属性来改变窗口的背…

Golang | Leetcode Golang题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; func searchInsert(nums []int, target int) int {n : len(nums)left, right : 0, n - 1ans : nfor left < right {mid : (right - left) >> 1 leftif target < nums[mid] {ans midright mid - 1} else {left mid 1}}retu…

【mac】【python】新建项目虚拟环境后,使用命令pip出现错误:zsh: command not found: pip

【mac】【python】新建项目虚拟环境后&#xff0c;使用命令pip出现错误&#xff1a;zsh: command not found: pip 问题描述&#xff1a; 拉取或者创建新的python项目时&#xff0c;为项目添加了新的解释器&#xff0c;创建啦虚拟环境&#xff0c;但是执行pip命令的时候找不到命…

倾斜摄影修模软件模方(ModelFun)4.1.0下载及安装教程

文章目录 一、模方(ModelFun)4.1.0安装二、模方(ModelFun)4.1.0下载一、模方(ModelFun)4.1.0安装 订阅专栏后(获取专栏内所有文章阅读权限及软件安装包),从文末下载软件模方(ModelFun)4.1.0安装包,如下所示,并开始安装。 1.计算机需要进入测试模式 键盘WIN+R,打开运行窗…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

jenkins修改全局安全配置之后登录错误

教训&#xff08;流泪&#xff09; 事情是这样的&#xff0c;第一次我需要用单点登录集成jenkins&#xff0c;jenkins可以通过插件的方式支持cas协议&#xff0c;我当时也不很懂&#xff0c;经过我学网上的一顿乱配置&#xff0c;jenkis上不去了&#xff0c;虽然这是公司本地环…

【Linux学习】初识shell命令以及运行原理

这里写目录标题 &#x1f680;shell命令以及运行原理 &#x1f680;shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff08;如下图所示&#xff09;&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ 。 Linux系统的shell作为操作系统的外壳&…

开源大模型Llama 3 横空出世,4000亿参数性能直逼GPT-4

开源大模型Llama 3王者归来!最大底牌4000亿参数,性能直逼GPT-4 扎克伯格:「有了 Llama 3,全世界就能拥有最智能的 AI。」 ChatGPT 拉开了大模型竞赛的序幕,Meta 似乎要后来居上了。 扎克伯格在 Facebook 上发帖:Big AI news today. 借助先进的 Llama 3 模型,Meta 的 A…

STL的stack和queue(三):基于适配器模式的反向迭代器

目录 前言 list的反向迭代器 list.h文件 ReverseIterator.h文件 test.cpp文件 前言 迭代器按性质分类&#xff1a; 单向&#xff1a;forward_list双向&#xff1a;list随机&#xff1a;vector / deque 迭代器按功能分类&#xff1a; 正向反向const list的反向迭代器…

【笔试强训】Day2 --- 牛牛的快递 + 最小花费爬楼梯 + 数组中两个字符串的最小距离

文章目录 1. 牛牛的快递2. 最小花费爬楼梯3. 数组中两个字符串的最小距离 1. 牛牛的快递 【链接】&#xff1a;牛牛的快递 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。 #include <iostream> #include <cmath> using namespace std;…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

鸿蒙开发语言_ArkTS开发语言体验_TypeScript语言环境搭建_TS声明和数据类型---HarmonyOS4.0+鸿蒙NEXT工作笔记003

可以看到我们新建的这个项目,有个 @State message: String =Hello ArkTS 这个就是定义了一个变量,可以看到 message是变量名,String是变量类型. 然后我们可以看看它的结构可以看到 build() 下面有个Row,然后再下面有个Column方法,然后,里面就是具体的内容了,首先就是显示了一…

高速公路车型识别系统的新篇章:激光雷达解决方案的探索与应用

高速公路车型识别系统&#xff1a;激光雷达解决方案的探索与应用 随着智能交通领域的迅速发展&#xff0c;高速公路车型识别技术成为提高交通管理效率与安全性的关键一环。激光雷达作为一种高精度、高可靠性的传感器技术&#xff0c;在高速公路车型识别中展现出巨大的应用潜力…

华强电子网(www.hqew.com)2023年度电子行业优秀国产品牌企业评选

华强电子网&#xff08;www.hqew.com&#xff09;2023年度电子行业优秀国产品牌企业评选&#xff0c;历经四个月的激烈竞争和严格审核&#xff0c;经过企业提名、专家筛选、公众投票和专家评审四大阶段&#xff0c;近千家电子行业企业成功提名&#xff0c;其中有超过200家国产品…

像经典编程一样简单!MIT科学家开发新型量子计算机模型

量子计算软件市场预计将迎来指数级增长&#xff0c;预测到2030年其复合年增长率&#xff08;CAGR&#xff09;将达到21.9%。这不仅预示着前所未有的计算能力的解放&#xff0c;而且能够帮助各行各业解决极其复杂的问题。 量子计算软件包括一系列工具、算法和编程语言&#xff0…

Training - PyTorch Lightning 的 Horovod 策略实践 (all_gather)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137686312 在 PyTorch Lightning 中使用 Horovod 策略&#xff0c;可以在多个 GPU 上并行训练模型。Horovod 是分布式训练框架&#xff…

Linux sudo suid提权练习

题目比较简单&#xff0c;可以利用sudo和多种suid程序提权&#xff0c;做个记录 进入靶场题目环境 获得节点信息 远程连接上 执行命令id&#xff0c;发现只是admin普通账户 sudo提权 发现存在 /usr/bin/vim, /usr/bin/bash, /usr/bin/more, /usr/bin/less, /usr/bin/nano, /…

CSS入门:link链接样式和4种状态的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具…

React + 项目(从基础到实战) -- 第九期

实现分页 , LoadMore 上划加载更多功能效果 分页 page : 当前页 pageSize: 页面大小 自定义分页组件 组件传值 import {FC , useEffect, useState } from reactimport { useNavigate , useLocation ,useSearchParams} from react-router-dom;import { Pagination } from &quo…