linux 编译 c++ 静态库(包含类的实例化)给 c 程序调用

news2024/11/18 23:43:37

文章目录

    • 使用场景
    • 代码示例
    • 编译
    • 运行示例程序
    • 参考文章

使用场景

c++ 是面向对象的编程语言,比较方便实现某些第三方库,比如翻译其他面向对象语言的代码,比 c 语言要方便的多。而 c 语言跟 c++ 很亲和,可以用 c++ 来实现,编译成静态库,提供给 c 程序使用。 至于用静态库而不是动态库,是因为静态库会打包到 c 程序中,不需要依赖运行场景中是否有该库的存在,方便部署。当然,如果第三方库的代码量太大,直接打包导致程序体积膨胀剧烈的话可以考虑动态库。

代码示例

  • 目录结构
    在这里插入图片描述

  • 代码预览
    在这里插入图片描述

  • c++ 类库代码: myclass.h, myclass.cpp。在这些文件中实现第三方库的所有功能。

    // myclass.h
    
    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    class MyClass {
        private:
            int x, y;
        public:
            MyClass(int _x, int _y) {
                this->x = _x;
                this->y = _y;
            }
        public:
            int getSum(){
                return this->x + this->y;
            };
    };
    
    int api_getSum(int x, int y);
    
    #endif
    
    // myclass.cpp
    
    #include <iostream>
    #include "myclass.h"
    
    int api_getSum(int x, int y) {
        MyClass obj(x, y);
        std::cout<<"实例化对象完成"<<std::endl;
        return obj.getSum();
    }
    
  • 封装类库 api 为 c api 的 wrapper 文件:myclass_wrapper.h, myclass_wrapper.cpp。该文件只用于封装第三方库提供的 api 为c语言函数风格,不需要实现第三方库的具体功能,不使用第三方库的 c++ 类型,比如 class myclass。wrapper 中的函数需要用 extern “C” {} 包裹声明语句。

    // myclass_wrapper.h
    
    #ifndef MYCLASS_WRAPPER_H
    #define MYCLASS_WRAPPER_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int c_api_getSum(int x, int y);
    
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif
    
    // myclass_wrapper.cpp
    
    #include "myclass_wrapper.h"
    #include "myclass.h"
    
    int c_api_getSum(int x, int y) {
       return api_getSum(x, y);
    }
    
  • c 程序示例代码:main.c

    // main.c
    
    #include "stdio.h"
    #include "myclass_wrapper.h"
    
    int main(int argc, char **argv)
    {
        int sum = c_api_getSum(999, 2);
        printf("%d + %d = %d\n", 999, 2, sum);
        return 0;
    }
    

编译

#生成类库中间文件 myclass_wrapper.o myclass.o
g++ -std=c++11 -c src/myclass_wrapper.cpp src/myclass.cpp -Iinclude

#打包中间文件为静态库 libmyclass.a
ar -r libmyclass.a myclass_wrapper.o myclass.o

#编译 c 示例程序, -lstdc++ 是链接 c++ 标准库,为了在用到类似 <iostream> 的 c++ 库时能编译通过。
gcc -std=c99 main.c -o main -L./ -I./include -lmyclass -lstdc++

运行示例程序

./main

在这里插入图片描述

参考文章

  • C调用C++库和C++调用C库的方法

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

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

相关文章

SAP灵活工作流客制化值帮助

目录 1. 创建值帮助CDS视图 2. 添加值帮助CDS视图对应的ODATA服务 3. 在灵活工作流中设置搜索帮助 4. 效果展示 1. 创建值帮助CDS视图 创建值帮助数据源视图 创建值帮助视图 Dummy表结构如下 2. 注册值帮助CDS视图对应的ODATA服务 事务代码 /N/IWFND/MAINT_SERVICE 选择添加…

【mysql】-【innodb数据存储结构】

文章目录数据库的存储结构&#xff1a;页磁盘与内存交互基本单位&#xff1a;页页结构概述页的大小页的上层结构页的内部结构数据库的存储结构&#xff1a;页 一、索引结构给我们提供了高效的索索隐方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的&#xff0c;确…

MongoDB数据库 | 三分钟学会MongoDB索引,快来看看与MySQL索引有何不同?

目录一、创建索引1、创建索引2、通过索引查询二、复合索引三、索引内嵌文档四、索引基数五、explain六、为何不使用索引七、固定集合一、创建索引 1、创建索引 > db.student.createIndex({"name":1}) {"numIndexesBefore" : 1,"numIndexesAfter&…

【unity3D】Audio Source组件

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Audio Source组件 Audio Source组件常用的属性解释&#xff1a; AudioClip&#xff1a;在这里指定需要播放的音频片段。Output …

Java面试题每日10问(3)

Core Java - OOPs Concepts: static keyword Interview Questions 1.What if the static modifier is removed from the signature of the main method? Program compiles. However, at runtime, It throws an error “NoSuchMethodError.” 2. What is the difference betw…

2023年会发生什么,一点都不会神秘

文/明道云创始人任向晖我很少写市场预测文章&#xff0c;是因为影响经济活动的要素实在太多了。做任何预测的时候&#xff0c;想明白了一二&#xff0c;但没有预计到三&#xff0c;结果可能就完全不一样。过去三年的疫情就是一个典型的例子。但是这个冬天的预测显得格外重要一些…

Redis+注解实现API接口防刷限流

前言 在开发分布式高并发系统时有三把利器来保护系统&#xff1a;缓存、降级、限流。 缓存: 缓存的目的是提升系统访问速度和增大系统处理容量&#xff1b;降级&#xff1a;降级是当服务出现问题或者影响到核心流程时&#xff0c;需要暂时屏蔽掉&#xff0c;待高峰或者问题解…

软件测试之维护性测试

维护性测试用于评估系统能够被预期的维护人员修改的有效性和效率的程度&#xff0c;可从模块化、可重用性、易分析性、易修改性、易测试性、易维护性 1)模块化&#xff1a;评估由独立组件组成的系统或计算机程序&#xff0c;其中一个组件的变更对其他组件的影响大小程度&#x…

【Android 车载 App】实现座椅调节控制十字指针的效果

【Android 车载 App】实现座椅调节控制十字指针的效果效果展示实现方法思路代码第一步&#xff0c;画两条十字虚线第二步&#xff0c;在每个虚线的末端画出圆角三角形第三步&#xff0c;在十字虚线的中间位置画出两个同心圆&#xff0c;一个填充内容&#xff0c;一个描边第四步…

一款新兴的操作pcap的神器

一 前言有机会接触到这款软件&#xff0c;还是同事的一个图&#xff0c;图介绍了开源项目Zed和基于Zed做的一款全流量安全产品Brim。整个产品其实是不少开源项目的一个小集成&#xff0c;只所以感兴趣&#xff0c;除了brim在github有1.5k个star的原因外&#xff0c;更吸引我的是…

缓存的数据一致性

文章目录1.先更新缓存&#xff0c;再更新DB2.先更新DB&#xff0c;再更新缓存3.先删除缓存&#xff0c;后更新DB4.先更新DB&#xff0c;后删除缓存 &#xff08;推荐&#xff09;前言&#xff1a; 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#…

Neo4j网页服务器端口Cypher操作直接创建知识图谱

案例1:创建新节点、关系 CREATE (n:美国企业家{name:马斯克}) MERGE (n) <-[:主公]- (n1:总统{name:拜登}) RETURN *创建其他节点的时候,可以一次输入:例如 CREATE

代码随想录day32

第32天 前言 终于到周六了&#xff0c;明天可以休息了&#xff0c;哈哈哈 122. 买卖股票的最佳时机 II 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多…

DenseNet详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、DenseNet网…

深度学习——语言模型(笔记)

语言模型&#xff1a;NLP经典的模型 1.语言模型 ①长度为T的文本序列中词元依次是x1,…,xT&#xff0c;xT被认为是文本序列在时间t处的观测或标签。在给定文本序列&#xff0c;语言模型的目标是估计序列的联合概率p(x1,…,xT) ②序列模型的核心是整个序列文本所出现的概率 应…

国家基础地理信息中心行政边界等矢量数据免费下载保姆级教程--关于地理数据收集与处理的基本工具推荐(7)

关于地理数据收集与处理的基本工具推荐系列&#xff0c;有导航&#xff0c;不迷路&#xff1a; 关于地理数据收集与处理的基本工具推荐(1) —高分辨率卫星影像数据免费下载方式关于地理数据收集与处理的基本工具推荐(2)—10m精度的全球土地覆盖数据下载关于地理数据收集与处理…

勿忘2022,迎接2023

2022真的可以说是很不平凡的一年&#xff0c;很多想做的事情也因为一些原因没有做成。不过2022年已经过去&#xff0c;一年一度的总结还是要来写的。废话不多说&#xff0c;还是定关键词。2017年是“小确幸”和“在路上”&#xff0c;感谢师兄师姐的帮助&#xff0c;接触了很多…

write和fwrite

如果只是普通地以O_RDWR的flag去open一个文件朝里write&#xff08;不考虑创建、扩增&#xff09;&#xff0c;那默认内核会把文件的这个页面读进来缓存在内核里的&#xff0c;也即所谓的page cache。随后再发起新的write syscall写相同的页面时&#xff0c;只要写在page cache…

【博学谷学习记录超强总结,用心分享|产品经理基础总结和感悟13】

这里写目录标题第一章、概述第二章&#xff0c;内容服务产品分析框架&#xff1a;用户-平台-创作者内容服务平台优化思考第一章、概述 在分析文字类内容产品之前&#xff0c;我们先来思考一下内容产品的本质是什么&#xff1f;笔者认为&#xff0c;所有满足用户需求的信息服务…

aws beanstalk 使用docker平台部署beanstalk应用程序

参考资料 使用 Docker 平台分支 之前的文章分享过如何使用eb cli工具创建application和eb环境&#xff0c;本文介绍beanstalk支持的docker容器部署 关于beanstalk环境创建相关的资源和部署逻辑&#xff0c;参考之前的文章《aws beanstalk 使用eb cli配置和启动环境》 $ eb …