linux c++调用c

news2024/12/24 8:30:11

参考 【Linux下gcc编译的四个过程】_Deacde_ZY的博客-CSDN博客

C与C++如何互相调用_c文件引用c++头文件_卍一十二画卍的博客-CSDN博客

Linux动态链接库的创建与使用_linux创建动态库_满天星羽的博客-CSDN博客

 c++调用c

1.1 

例子1: test1.c

#include <stdio.h>
//#include "test1.h"
void hello()
{
   printf("hello world  11\n");

}

例子2:  直接在.cpp文件里面  使用extern "C"

///#include "test1.h"

extern "C" 
{
extern  void hello();
}

int  main()
{

hello();

}

编译:g++ test1.c test2.cpp -o test88 报如下error

原因: test1.c 并没有说明test1.c 里面的函数按照c的方式编译,而在test2.cpp里面是按照c的格式来使用。正确的方法应该分开编译,然后再链接:

gcc -c test1.c  -o test1.o   // 1   参数-c 表示编译但不链接 这里只能用gcc 编译

g++ -c test2.cpp -o test2.o  // 2  编译不链接

g++ test2.cpp test1.o  test  //3   链接所有.o  

注意:步骤2,3 可以综合成  g++ test2.cpp test1.o -o test 

1.2 改进: 增加test1.h 文件,去除在test2.cpp 里面直接引用,改为使用test1.h头文件

test1.h

extern "C" 
{
extern void hello();
}

改进后的test2.cpp  使用头文件

#include "test1.h"

int  main()
{

hello();

}

编译:

gcc -c test1.c  -o test1.o   // 1   参数-c 表示编译但不链接 这里只能用gcc 编译

g++ test2.cpp test1.o -o test 

改进3:test1.c 包含test1.h  g++编译test1.c时,在编译时先对test1.h 进行了预处理。仍然按照c的方式编译。

test1.c

#include <stdio.h>
#include "test1.h"
void hello()
{
   printf("hello world  11\n");

}
编译:一步到位

g++ test1.c test2.cpp -o  test

c++ 调用c的惯用方法: 在 .cpp文件中 加入 extern "C " { #include "test1.h"}

test1.h
extern void hello(); 
当作为动态库给外部模块使用时 必须要加 extern
 

 test1.c

#include <stdio.h>
void hello()
{
   printf("hello world  11\n");

}

例子2:  直接在.cpp文件里面  使用extern "C"

extern "C" 
{
#include "test1.h"
}

int  main()
{

hello();

}

编译:两步走

 gcc -c test1.c -o test1.o
 g++ test2.cpp  test1.o -o  test
 

这种方法的优点是 不用对原来的c文件或c开源库做任何的改动. 推荐。

1.3 编译动态库和使用

-fPIC 或 -fpic 参数的作用是使得 gcc 生成的代码是与位置无关的,也就是使用相对位置。

-shared参数的作用是告诉编译器生成一个动态链接库

gcc test1.c -shared -fpic -o libtest1.so   // 生成动态库 -fpic 生成位置无关的代码

g++ test2.cpp  -L . -ltest1  -o testcpp
 

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

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

相关文章

python3GUI--详细讲解一个QQ音乐组件的制作By:PyQt5(详细介绍、附源代码)

文章目录 一&#xff0e;前言二&#xff0e;设计1&#xff0e;思路2&#xff0e;布局3&#xff0e;自定义组件1.支持hover事件的QLabel2.自定义的QToolButton 4&#xff0e;图片圆角5&#xff0e;动画效果 三&#xff0e;源代码四&#xff0e;总结 一&#xff0e;前言 有网友给…

大数据-玩转数据-Flink SQL编程

一、概念 1.1 Apache Flink 两种关系型 API Apache Flink 有两种关系型 API 来做流批统一处理&#xff1a;Table API 和 SQL。 Table API 是用于 Scala 和 Java 语言的查询API&#xff0c;它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。 Flink SQL 是…

大转盘抽奖活动设计完全指南,轻松打造难忘的客户体验

大转盘抽奖活动是一种非常受欢迎的营销方式&#xff0c;可以吸引消费者参与并增加品牌曝光度。下面将为大家介绍一种简单易学的大转盘抽奖活动制作教程。 首先&#xff0c;我们需要使用第三方平台/工具来制作大转盘抽奖活动。这里以乔拓云平台为例&#xff0c;首先我们需要注册…

基于监督学习的多模态MRI脑肿瘤分割,使用来自超体素的纹理特征(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

1小时掌握Python操作Mysql数据库之pymysql模块技术

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 近日锋哥又卷了一波课程&#xff0c;Python操作Mysql数据库的pymysql技术&#xff0c;文字版视频版。1小时掌握。 视频版教程 1小时掌握Python操作Mysql数据库之pymysql模块技术 文字版…

Remix 2.0 正式发布,现代化全栈Web框架!

9 月 16 日&#xff0c;全栈 Web 框架 Remix 正式发布了 2.0 版本&#xff0c;Remix 团队在发布 1.0 版本后经过近 2 年的持续努力&#xff0c;发布了 19 个次要版本、100 多个补丁版本&#xff0c;并解决了数千个问题和拉取请求&#xff0c;终于迎来了第二个主要版本&#xff…

【计算机毕业设计】基于SpringBoot+Vue记帐理财系统的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…

【红外图像增强】基于引力和侧向抑制网络的红外图像增强模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Verilog教程】4.3Verilog 时序控制

关键词&#xff1a;时延控制&#xff0c;事件触发&#xff0c;边沿触发&#xff0c;电平触发 Verilog 提供了 2 大类时序控制方法&#xff1a;时延控制和事件控制。事件控制主要分为边沿触发事件控制与电平敏感事件控制。 时延控制 基于时延的时序控制出现在表达式中&#xff…

【ACDC数据集】:预处理ACDC心脏3D MRI影像数据集到VOC数据集格式,nii转为jpg,label转为png

【Segment Anything Model】做分割的专栏链接&#xff0c;欢迎来学习。 【博主微信】cvxiaoyixiao 本专栏为公开数据集的预处理&#xff0c;持续更新中。 文章目录 1️⃣ ACDC数据集介绍2️⃣ ACDC数据集样例 3️⃣ 预处理ACDC目标 4️⃣ 处理结果样图 5️⃣ 代码 6️⃣ 划分测…

【算法挨揍日记】day08——30. 串联所有单词的子串、76. 最小覆盖子串

30. 串联所有单词的子串 30. 串联所有单词的子串 题目描述&#xff1a; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["…

SSM - Springboot - MyBatis-Plus 全栈体系(十一)

第二章 SpringFramework 五、Spring AOP 面向切面编程 6. Spring AOP 基于 XML 方式实现&#xff08;了解&#xff09; 6.1 准备工作 加入依赖和基于注解的 AOP 时一样。准备代码把测试基于注解功能时的 Java 类复制到新 module 中&#xff0c;去除所有注解。 6.2 配置 Sp…

SpringBoot项目(百度AI整合)——如何在Springboot中使用语音文件识别 ffmpeg的安装和使用

前言 前言&#xff1a;在实际使用中&#xff0c;经常要参考官方的案例&#xff0c;但有时候因为工具的不一样&#xff0c;比如idea 和 eclipse&#xff0c;普通项目和spring项目等的差别&#xff1b;还有时候因为水平有限&#xff0c;难以在散布于官方的各个文档读懂&#xff…

【广州华锐互动】VR虚拟党建云展馆:带你沉浸式领略红色文化

在新时代的背景下&#xff0c;科技与党建的结合已成为一种趋势。VR&#xff08;Virtual Reality&#xff0c;虚拟现实&#xff09;技术作为一种新兴的科技手段&#xff0c;为党建工作提供了全新的载体。VR虚拟党建云展馆&#xff0c;就是将VR技术应用于党建工作的一个典型例子&…

招聘程序员(软件开发工程师),如何做岗位胜任力测评?

一、 程序员的基本工作内容 1、 负责项目组内的代码维护和更新迭代&#xff0c;保证研发效率&#xff0c;对于运营产品提出的需求应积极沟通并实现。 2、 规范相关开发文档等相关资料&#xff0c;对于有变更的代码和功能需求&#xff0c;要对开发文档做出相应的变更。 3、 作为…

三维重建_纹理重建与表面细化

目录 前言&#xff1a;为什么要重建纹理&#xff1f; 1. 纹理图像的自动创建 1.1 基础知识 1.2 算法流程 1.2.1 视角选择 1.2.2 纹理坐标的计算 1.2.3 全局颜色调整 1.2.4 泊松图像编辑 1.2.5 OBJ文件 1.3 结果示例 2. 网格细化优化 2.1 基础知识与数学模型 2.2 优…

【Python基础】对Python的深入认识以及各种情况的报错汇总

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

在给应用ASO优化时要注意些什么

应用名称是搜索引擎优化和转化率优化非常重要的元素。用户在搜索结果页面中看到我们的应用程序&#xff0c;这是他们决定是否想要更多地了解我们应用的地方。当用户已经在查看产品页面时&#xff0c;应用程序名称也会影响转化率&#xff0c;如果列表元数据有吸引力&#xff0c;…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…

【数据集标注】上古软件LabelImg的保姆级使用教程

1&#xff1a;下载文件并解压 进入链接&#xff1a;mirrors / tzutalin / labelimg GitCode 点击绿色按钮【克隆】 &#xff0c;再点击按钮【zip】&#xff0c;随后下载到本地 移动下载的压缩文件到合适的位置&#xff0c;此处我以桌面为例子 右键点击该zip压缩文件&#xff…