【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so

Linux C++,so动态库 示例实例 Linux C++,so动态库 示例实例 本文以Eclipse集成开发环境为例进行说明。 # 一、主要步骤 **(1)创建动态连接库(.so)工程** (1.1)建立.so工程; (1.2)添加MyHelloworld.cpp、MyHelloworld.h文件 (1.3)添加 -fPIC编译选项 (1.4)新增自定义成员函数:PrintHelloWorld函数 ............ 阅读详情
AI摘要

本文详细介绍了在Linux环境下,使用GCC和G++编译器生成和使用动态链接库的过程。从创建头文件和源代码,到编译生成动态库,再到链接库并执行程序,提供了完整的步骤和示例。同时,还解释了动态库更新后,可执行程序如何自动使用新库。

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,
也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。

谈点实际价值:
如果个人是使用的是Mac,而别人提供的链接库文件*.so是linux的,那么这个时候就不能直接使用了,这个链接表源文件在的话可以按照如下教程自行进行生成Mac版的

动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,
我们将这几个文件编译成一个动态库:libtest.so。

$ more so_test.h 
#ifndef CSTUDTY5_SO_TEST_H
#define CSTUDTY5_SO_TEST_H

#include "stdio.h"

void test_a();

void test_b();

void test_c();

#endif //CSTUDTY5_SO_TEST_H

$ more test_a.c 
#include "so_test.h"

void test_a() {
    printf("this is in test_a...\n");
}

$ more test_b.c 
#include "so_test.h"
void test_b()
{
    printf("this is in test_b...\n");
}

$ more test_c.c 
#include "so_test.h"

void test_c() {
    printf("this is in test_c...\n");
}
$ 

将这几个文件编译成一个动态库:libtest.so

$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
或者
$ g++ test_a.c test_b.c test_c.c -fPIC -shared -o libtest2.so

上述2个命令选择其中1个就成,可以爬到通过gcc与g++生成的动态库文件大小略有区别的


$ ll
drwxr-xr-x  10 mac  staff   320 Jun  4 19:32 .
drwxr-xr-x   9 mac  staff   288 Jun  4 19:32 ..
-rwxr-xr-x   1 mac  staff  8440 Jun  4 19:32 libtest.so
-rwxr-xr-x   1 mac  staff  8456 Jun  4 19:32 libtest2.so
-rw-r--r--   1 mac  staff   151 Jun  4 19:28 so_test.h
-rw-r--r--   1 mac  staff    78 Jun  4 18:57 test_a.c
-rw-r--r--   1 mac  staff    77 Jun  4 18:58 test_b.c
-rw-r--r--   1 mac  staff    77 Jun  4 19:30 test_c.c

动态库的链接/动态库的使用

我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。

$ more test.c
#include "so_test.h"

int main() {
    test_a();
    test_b();
    test_c();
    return 0;
}

将test.c与动态库libtest.so链接生成执行文件test:

$ gcc test.c -L. -ltest -o test
或者
$ g++ test.c -L. -ltest2 -o test2

到此为止,已经生成了可执行文件test,test2,可以执行命令看看(执行成功,完美)

$ ./test
this is in test_a...
this is in test_b...
this is in test_c...

$ ./test2
this is in test_a...
this is in test_b...
this is in test_c...

扩展练习

我们修改下test_c.c文件

$ more test_c.c
   #include "so_test.h"

   void test_c() {
       printf("this is in test_cccccc...\n");
   }

重新生成下相应的动态库libtest.so

$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

再执行下之前生成的可执行程序test(注意:这里可没有重新生成可执行程序test哟)

$ ./test
this is in test_a...
this is in test_b...
this is in test_cccccc...

题外话:动态链接库的意思就是链接库独立存在,变更之后,之前依赖它的可执行程序会自动使用新的链接库进行执行。

编译参数解析

最主要的是GCC命令行的一个选项:

  • -shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

  • -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

  • -L.:表示要连接的库在当前目录中

  • -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

  • LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
    当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

参考文章:

https://www.cnblogs.com/huangxinzhen/p/4047051.html

C++生成动态连接库 静态库和动态库区别是库的加载时间不同。:在链接阶段库将会与.o目标文件一起打包生成可执行文件,成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。:在编译阶段都不会有任何动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。优点:动态库可以实现进程之间资源共享,有一份就行。升级程序简单,不需要重新编译。 阅读详情

相关推荐

如何实现C++动态调用动态链接库(DLL或SO)

使用函数指针来定义函数的类型,以便在动态库中找到的函数能够正确地调用。函数指针的类型必须与函数的签名(参数类型和返回类型)匹配。// 函数指针#ifdef _MSC_VER // Windows环境下的导出声明__declspec。

weixin_48438353的博客 7984

生成与调用C++动态链接库(so文件)

动态链接库是代码重用和模块化的重要工具,它使得将功能封装为独立的库更加容易,同时还可以动态加载和升级这些库,提高了程序的灵活性和可维护性。当我们希望将C++源码编译成动态链接库,并在其他应用程序中调用这个动态链接库,是这篇文章的应用场景。这篇文档将介绍如何创建、编译、链接和调用C++动态链接库。PS:本文以下内容根据我实际工作项目编写,不采用demo的形式。本文介绍了如何制作C++动态链接库(so文件)以及如何从另一个C++程序中加载和调用该库。

JulyLi2019的博客 1万+

动态链接库*.so的编译与使用

动态链接库*.so的编译与使用       动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、t

5041

C++编写、生成、调用so库详解(一)

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程.首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发.

田一一的博客 5484

linux/Ubuntu 下使用 java 调用 so 动态链接库详细步骤

本文章介绍的方法为小弟查找资料摸索出来的,为方便以后学习使用,同时提供给刚接触 JNI 的小白一个 demo 文中有错误的概念请大神们不吝教诲~~~ 1、编写 java 类,先上代码 package com.demo.jni; public class HelloJNI { // 声明 so 库中的方法 public native static String sayHi(Str...

chinadim的专栏 1755

做蛋白组学数据分析,竟然还不会使用DIA-NN软件,走过路过不要错过,进来免费学习!!!

蛋白组学分析工具DIA-NN使用

wcy1995427的博客 9866

c++将.cpp编译为.so文件

1.首先看文件形式 其中cpp1是直接调用.cpp和生成.so的文件夹。 cpp2是测试生成的.so可以使用的文件夹。 2.先直接编译.cpp检查代码没问题 a.cpp内容: #include <iostream> #include "a.h" void A::readImg(char* path) { B b; b.readImg(path); } a.h内容: #ifndef A_H_ #define A_H_ #include "b.h" c.

智障变智能 1万+

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 518

【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp

【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp 附:当前项目cstudy7 本文可以收获什么? 将其它项目生成的动态链接库拿到本项目中使用 CMakeLists.txt中使用其它项目的动态链接库 Mac OS X下的ldd工具——otool使用姿势 cstudy5中,我们演示了自己的写的源码进行编译成链接库,本章将讲解编译开源的jsonc...

明月专栏 785

速腾RS-LiDAR-16激光雷达ROS配置全攻略:从硬件连接到Rviz点云可视化

本文详细介绍了速腾RS-LiDAR-16激光雷达在ROS环境中的配置与使用全攻略,涵盖硬件连接、网络配置、ROS驱动安装及Rviz点云可视化等关键步骤。通过实战案例和技术解析,帮助开发者快速实现激光雷达数据采集与处理,提升机器人感知系统的部署效率。

ooo22的博客 249

在Window上安装和配置VTK9.x,并在QT项目中调试VTK是否可用

VTK+MSVC+Qt Creator + CMake配置

qq_42279379的博客 1000

【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇-编译jsoncpp

cstudy5中,我们演示了自己的写的源码进行编译成链接库,本章将讲解编译开源的jsoncpp 备注:上面提到的cstudy5示例参见: https://blog.csdn.net/hl_java/article/details/90812168 cppjson源码github https://github.com/lzc-alioo/jsoncpp git clone后发现文件太多,我把我们...

明月专栏 830

CSAPP performance lab

CSAPP 深入理解计算机系统的performance Lab

weixin_46091531的博客 1253

Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

linux静态库生成与使用:http://www.cnblogs.com/johnice/archive/2013/01/17/2864319.html Linux中so文件为共享库,与windows下dll类似,不过实现要简单。 so可以供多个进程使用,不同进程调用同一个so文件,所使用so文件不同。 so文件源程序不需要main函数,有也不会被执行。 下面通过一个简单例子,来学习.so

爱拼才会赢 5万+

我在腾讯上构建了一个人人能用的机载适航知识库

当ChatGPT掀起生成式AI的浪潮时,工程师们发现了一个尴尬的现实:询问“如何编写软件合格审定计划”,AI的回答可能充满似是而非的术语,却无法精确关联FDO-178C的对应内容。现在市面上有许多的AI大模型+适航知识库的方案,之前我的文章介绍了一种本地大模型加知识库的解决方法。此外,ima知识库的容量大小可以到30GB(企鹅大气),只要管理好文件的格式,理论上是完全可以把机载适航相关的内容容纳进去的。后续会不断增加适航法规,适航规章,适航标准,适航书籍,适航相关的论文,以及网上其他一些优秀的内容。

qq_41854911的博客 1223

计算机网络实验报告实验七可靠传输TCP协议分析

计算机网络实验报告实验七可靠传输TCP协议分析

m0_56638814的博客 966

cpp封装dll和so,cpp调用so

Linux的so文件到底是干嘛的?浅析Linux的动态链接库 - 知乎微信公众号:ilulaoshi,原文发表在我的个人网站:Linux的so文件到底是干嘛的?浅析Linux的动态链接库 上一篇我们分析了Hello World是如何编译的,即使一个非常简单的程序,也需要依赖C标准库和系统库,链接其实就…https://zhuanlan.zhihu.com/p/235551437(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一) - 知乎前言:C以及C++的动态链接库和静态链接库,

liguandong 4573

高云FPGA系列教程(1):FPGA和ARM开发环境搭建

至此,高云FPGA和MCU开发环境就搭建完成了,整体还是比较简单的,几乎是一键完成,下一篇文章我们进行实际的FPGA和MCU开发。本文是高云FPGA系列教程的第1篇文章。

whik1194的博客 6187

linux下如何将c++程序编译成so,如何调用该so文件

so文件为动态链接库文件,与windows下的dll文件相当,linux下系统so文件一般保存在/usr/lib中。 下面就说明一下如何生成c++程序的so文件,以及如何在c++程序中调用该so文件 ==========test.h=========== #ifdef __cplusplus // extern "C" { #endif   class Test{ pub

yizezhong的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux下将c++编译成so,调用该so文件

在其他资料上增加了过程中遇到的问题。 so文件为动态链接库文件,与windows下的dll文件相当,Linux下系统so文件一般保存在/usr/lib中。 下面就说明一下如何生成c++程序的so文件,以及如何在c++程序中调用该so文件 ==========test.h=========== #ifdef __cplusplus // extern "C" { #endif class Test{ public: int hello(int i); }; int helloT(int ..

qq591840685的专栏 2640

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

将cpp文件封装成 so 文件并调用

一、前言 本篇记录下将 Cpp文件打包成so 文件,并在其他cpp文件中作调用 二、将cpp文件编译为so文件 在文件夹 cpp1 下创建a.h a.cpp b.h b.cpp 如下: //a.h #ifndef A_H_ #define A_H_ #include "b.h" class A { public: A(){} ~A(){} v...

cbd_2012的博客 2816

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Lua调用C++动态链接库.so

Lua调用C++动态链接库.so通过Lua调用C++动态库中的函数1. 例程头文件testlib.h2. 遇到的问题 通过Lua调用C++动态库中的函数 原文链接:https://blog.csdn.net/DeliaPu/article/details/114406620 上一篇介绍了如何在C++中调用Lua函数:C++调用Lua函数 本篇介绍反方向调用:通过Lua调用C++动态库中的函数。 1. 例程 定义一套C++函数,我们给它取名叫testlib.cpp: // testlib.cpp #in

宁静致远的博客 1753

在ubuntu下生成.so,并用cpp调用.so编译程序运行

这里我的程序还是g++和nvcc编译的,比其他的可能还复杂一点,大致步骤是: (1)g++编译.cpp文件生成.o文件 (2)nvcc编译.cu文件生成.o文件 (3)所有.o文件生成动态链接库.so文件 步骤(1)Makefile为: CPPFLAGS += -I./include CPPFLAGS += -I/usr/local/cuda/include CPPFLAGS += -I/home/lzc/Desktop/soft/cudnn-tensorRT/tensorRT/TensorRT

luozhichengaichenlei的博客 1222

Linux平台下动态链接库.so转换成windiws平台下.dll文件并使用python调用

问题起因: 在运行PointNet的可视化程序时,作者只提供了linux平台下的动态链接库程序源码,自己的windows平台下无法调用。发现是动态链接库的文件格式不对,遂学习如何将.so文件转换成.dll文件(PS:前提是你有文件的.cpp源码) 第一步新建C++动态链接库项目 将pch.h文件的内容改为如下: #ifndef PCH_H #define PCH_H // 添加要在此处预编译...

Moringstarluc的博客 8051

Python调用C/C++生成的动态链接库文件

1.python调用C语言生成的dll/so文件 首先在C语言需要一个源代码文件和一个头文件,头文件是必须的,否则不能被调用,这里以一个Add函数来作为例子,C源 文件代码如下: //add.c #include "add.h" int Add(int a,int b) { return a+b; } 在头文件中书写声明: //add.h int Add(int,int); Windows...

sinat_17700695的博客 1600

linux c++编译so,linux下将c++编译成so,调用该so文件

在其他资料上增加了过程中遇到的问题。so文件为动态链接库文件,与windows下的dll文件相当,Linux下系统so文件一般保存在/usr/lib中。下面就说明一下如何生成c++程序的so文件,以及如何在c++程序中调用该so文件==========test.h===========#ifdef __cplusplus //extern "C"{#endifclass Test{public:i...

weixin_42377538的博客 1124
上一篇: 【C++从入门到放弃】C++/g++不同文件夹的编译
下一篇: 【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇-编译jsoncpp
明月(Alioo)
博客等级 码龄18年 267粉丝 207原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月(Alioo)

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值