C和C++混编

C++和C的混合编译 简介 C++ 语言的创建初衷是 “a better C”,但是这并不意味着 C++ 中类似 C 语言的全局变量和函数所采用的编译和连接方式与 C 语言完全相同。作为一种欲与 C 兼容的语言, C++ 保留了一部分过程式语言的特点(被世人称为"不彻底地面向对象"),因而它可以定义不属于任何类的全局变量和函数。但是, C++ 毕竟是一种面向对象的程序设计语言,为了支持函数的重载, C++ 对全局函数的处理方式与 C 有明显的不同。 本文将介绍如何通过 extern “C” 关键字在 C++ 中支持 C 语言 和 阅读详情

最近的项目需要在.c文件里面调用.cpp文件中的函数,以及在cpp中调用c文件函数,用到了c/c++混合编译,在这里记录一下。

makefile大致思路:

 调用g++将所有.cpp文件编译成.o文件,调用gcc将所有.c文件编译成.o文件;

 调用g++将所有的.o文件链接成可执行文件;

步骤很简单,唯一要注意的是在.c文件对应的头文件中一定需要加上

#ifdef __cplusplus
extern "C"
{
#endif

/* 函数声明代码块 */

#ifdef __cplusplus
}
#endif

否则在链接的时候会出现 undefined reference to 的错误。

 

示例 Makefile:

TARGET = pdif
OBJ_PATH = objs
PREFIX_BIN = ./
SRC = ./

CROSS_COMPILE=arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++

#include path
INCLUDES = -I ./$(SRC)app

#source path
SRCDIR = $(SRC)app


#buid to object files
#C_SOURCES = $(wildcard *.c)
C_SRCDIR = $(SRCDIR)
C_SOURCES = $(foreach d,$(C_SRCDIR),$(wildcard  $(d)/*.c) )
C_OBJS = $(patsubst %.c, $(OBJ_PATH)/%.o, $(C_SOURCES))

#CPP_SOURCES = $(wildcard *.cpp)
CPP_SRCDIR = $(SRCDIR)
CPP_SOURCES = $(foreach d,$(CPP_SRCDIR),$(wildcard  $(d)/*.cpp) )
CPP_OBJS = $(patsubst %.cpp, $(OBJ_PATH)/%.o, $(CPP_SOURCES))

default:init compile

#buid c files
$(C_OBJS):$(OBJ_PATH)/%.o:%.c
	$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
#buid c++ files
$(CPP_OBJS):$(OBJ_PATH)/%.o:%.cpp
	$(CPP) -c $(CPPFLAGS) $(INCLUDES) $< -o $@

init:
	$(foreach d,$(SRCDIR), mkdir -p $(OBJ_PATH)/$(d);)

test:
	@echo "C_SOURCES: $(C_SOURCES)"
	@echo "C_OBJS: $(C_OBJS)"
	@echo "CPP_SOURCES: $(CPP_SOURCES)"
	@echo "CPP_OBJS: $(CPP_OBJS)"
	@echo "INCLUDES: $(INCLUDES)"
#link
compile:$(C_OBJS) $(CPP_OBJS)
	$(CPP)  $^ -o $(TARGET)  $(LINKFLAGS) $(LIBS)

clean:
	rm -rf $(OBJ_PATH)
	rm -f $(TARGET)

install: $(TARGET)
	cp $(TARGET) $(PREFIX_BIN)

uninstall:
	rm -f $(PREFIX_BIN)/$(TARGET)

rebuild: clean init compile

 

CPP文件和C文件混编和将sqlite3加入自己的c++工程 今天尝试将使用sqlite3数据库,直接使用sqlite3的源码,得到sqlite3.c和sqlite3.h。 我想将他们加入到我的cpp工程里面 所以我新建了一个mysqlite3.cpp文件,在里面调用了sqlite3的函数。 下面来说明我遇到的问题及解决方法 一共有两种编译方法,一种使用gcc/g++编译,一种使用cmake编译,下面就来说明这两种方法 工程源码在最后面。 第一种... 阅读详情

相关推荐

C和C++的混编问题

C和C++混编问题也是我在实际的开发过程中遇到的问题,由于编译器会根据源代码的后缀,自动选择C或者C++编译器。所以这个问题不小心的话,很容易忽略。 本文主要讲了c和c++文件混合编译的问题。比较简单。详细的可以参考我的另一篇文章,单独讲extern "C"的。C语言基础:extern "C"语句的作用。

qq_28096563的博客 504

C与C++混合编程

一、C与C++混合编程的原理 首先,我先了解一下编译的过程。分为四步:预处理(预处理用于将所有的#include头文件以及宏定义替换成其真正的内容)——编译(将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程)——汇编(汇编过程将上一步的汇编代码转换成机器码)——链接(链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件). 可以看下原文,大致了解一下:https://www.cnblogs.com/carpenterlee/p/5994681.html 在

weixin_38956024的博客 5928

oc和c/c++混编的一些坑

今天导入了一个第三方的库,库包含了.c文件。编译就各种报错。。。 网上查一下原因,应该就是c/c++混编的问题了,找到了几个解决办法: 大概看了一下,主要分为两种报错,先看看报出来的错误: 1. Unknown type name "NSString" 2. Could not build module 'Foundation' 先说说第一个报错:(尝试了第一

ynynynynx4的博客 2704

【C++入门】C和C++混合编程超详细讲解

用C语言写功能库代码时,需要对外提供的函数接口头文件用extern “C”{}括起来,将来库无论被C语言调用还是被C++调用都支持;

weixin_42031299的博客 1万+

RK3308语音识别----c和c++代码混编工程Makefile文件编写

最近在做语音识别相关,发现这个领域大部分代码都是C++和C都混编都工程,研究了下混编方式,写下记录过程 cust@virtualbox:~/alsa_test$ ls alsa libasound.so libasound.so.2 libasound.so.2.0.0 main.cpp Makefile test_one.c test_one.h main文件使用cpp结尾,test_one采用c结尾,如何混编呢?很简单,增加头文件,并在头文件里用一个宏!! test_one.h内容

weixin_41472344的博客 767

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

c++/c混合编程

一、 二、c++引用c extern "C" 三、c引用c++ ref: C++调用C出现的undefined reference 之坑------缺extern "C"_涛歌依旧的博客-优快云博客 再谈谈只针对C++编译器/链接器的extern “C“------C与C++的相互调用_涛歌依旧的博客-优快云博客 遇到问题 --- C++调用C静态库,出现undefined reference的问题 - 蜗牛的博客 | VK's Blog C++程序中出现undefined refere

wwwlyj123321的博客 2493

Allegro PCB设计实战:5分钟搞定DDR信号线的Match Group等长规则设置

本文详细介绍了在Allegro PCB设计中,如何快速为DDR信号线设置Match Group等长规则。通过实战演练,解析了从理解相对传输延迟原理、在规则管理器中创建Match Group,到设置合理容差和利用动态绕线指示的全流程,帮助工程师在5分钟内高效完成高速信号时序约束,提升设计可靠性与效率。

gg901的博客 1053

【Cpp】C和C++混合编程

一、混合编程杂绪 1.1 为什么需要混合编程 Cpp是从C演变过来的,C有很多优秀成熟项目和库,没必要在C++中重写,C++程序可以直接调用调用 庞大项目划分后一部分适合用C(底层),一部分适合用C++(中间层、上层) 1.2 混合编程的支撑 编译型程序的编译过程:源文件->目标(库)文件->可执行程序->镜像文件 任何编程语言执行时都必须是可执行程序,所以都必须先被编译成...

baymaxly的博客 7733

VASP+Multiwfn+VMD静电势计算与可视化全流程解析

静电势是表征分子与材料表面电荷分布的关键物理量,它通过求解泊松方程,将电子密度与原子核电荷在空间中的贡献结合起来,直观揭示体系的电子富集与缺失区域。这一性质在理解化学反应活性、分子间相互作用(如氢键、卤键)以及材料表面性质方面具有重要价值。在计算材料科学与量子化学领域,基于第一性原理计算获得高精度电子结构数据后,如何将其转化为可直观分析的静电势图,是连接理论计算与物理解释的关键技术环节。本文聚焦于构建一条高效、可控的端到端工作流,详细解析如何利用VASP进行高精度电子密度计算,通过专业波函数分析软件Mult

weixin_33733810的博客 430

芒果YOLOv8改进52:主干Backbone篇之GhostNetV2:提出原创GhostNetV2 架构升级版:引入长距离注意力机制增强廉价操作,构建更强端侧轻量型骨干,打造高效轻量级检测器

长距离注意力机制增强廉价操作,打造轻量级检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1611

Objective-C和C++混编

Using C++ With Objective-C苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库。Objective-C和C++混编的要点在 Objective-C++中,可以用C++代码调用方法也可以从Objecti...

bahai3145的博客 164

SolidWorks_模具设计5_分型线生成

分型线是模具设计的核心要素,直接影响产品质量、脱模可行性和制造成本。本文系统介绍了分型线生成技术,包括三种核心算法:基于凸包的方法适用于简单几何,可见性分析处理复杂曲面,曲率特征优化则能找到自然分界。文章提供了完整的Python实现示例,涵盖点云投影、网格处理和分型线评估等关键技术。通过理解这些原理和方法,工程师可以更高效地设计出满足外观要求、易于加工的分型线方案,显著提升模具设计质量和效率。

H17853509096的博客 178

iOS Objective-C和C、C++混编

iOS Objective-C和C、C++混编,最简单的办法是直接将要调用C、C++代码的.m文件改成.mm文件。 1、Objective-C和C混编,如果C方法写在.m文件内部,我们直接调用即可。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController // ...

programmer589的博客 1000

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2839

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2320

使用cmake混编c和c++

由于项目的需求,需要将c和c++混编,项目采用cmake。 直接上代码: project(main CXX C) # 这里可以不写CXX和C,但不能只写一个,否则只会编译指定语言 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #设置c++的编译选项 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -...

9212

基于STM32、HAL库的ICP-20100气压传感器 驱动程序设计

它具有低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。#define ICP20100_FIFO_CTRL 0x09 // FIFO控制寄存器。#define ICP20100_FIFO_DATA 0x0A // FIFO数据寄存器。#define ICP20100_FIFO_STS 0x0B // FIFO状态寄存器。#define ICP20100_FIFO_WTM 0x15 // FIFO水印设置。

corlin6688的博客 599

CMAKE支持C和Cpp文件混编

1、CMakeLists.txt需要适配C和C++编译器。2)通过“extern “C”进行修饰”1)通过cc文件,进行代码隔离。指定项目,支持C和C++语言。指定项目用C++14进行编译。2、c代码,调用C++函数。

weixin_54542524的博客 373

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

在Intellij IEDA 做 java和 c/c++混编

在Intellij IEDA 做 java和 c/c++混编 最近公司项目做语音录音,涉及导c++和java混合开发。研究了几天混编知识,这里总结下,记录下自己的劳动成果。 1. 什么是JNI?   JNI是Java Native Interface的缩写,它提...

aiyan4899的博客 1148

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Swift、C和C++混编

苹果推出Swift后,很快就受到程序猿的青睐,快速、安全、简洁的开发已经是一个大趋势了。如果在加上C和C++真的是天衣无缝了,完美结合。对于Swift调用C和C++,通常需要OC做桥接(oc调用c和c++),性能得不到优化。我们今天直接用Swift调用C使性能得到全面的提升。苹果号称和C一样快的Swift的demo我们来粒子。 测试环境: Xcode版本:11.0-beta Swift版...

海阔天空的专栏 8067

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Objective-C和C++混编的要点

<br />Using C++ With Objective-C<br />苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库。<br /><br />Objective-C和C++混编的要点<br />在 Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使

4319

C++和C混编时变量和函数的定义和使用

背景 项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。 问题及解决 原因 出现问题的根源主要包含以下两方面: C++和C使用不同的编译器,而编译器对变量和函数有不同的符号表示方法; C++是C的升级

Coding never stop! 1536

iphone开发之C++和Objective-C混编

 C++和Objective-C混编(官方文档翻译)原文网址:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.htmlUsing C++ With Objective-C    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Obje

随记 5372

iOS 静态类库 打包 C,C++文件及和OC混编

from  http://www.mamicode.com/info-detail-416411.html iOS 静态类库 编译 C,C++ 我们都知道,OC 原生支持C, 在 创建的 OC类的 .m 里面,可以直接编写C的代码; 同样 Xcode 也支持 OC ,C++的混编,此时,我们通常把OC创建的 .m 文件,手动修改为 .mm 文件以支持 oc c++的混编

zymx(u010820135)的专栏 3785

c++和c混编

c主程序调用c++函数,如本示例中的init()。 c++函数中又访问c中的变量,如本示例中的infoget(),访问了c中的变量a。 c++函数中又访问c中的函数,如本示例中的testget(),调用了c中的geta()。 概述 示例代码目录: [root@localhost ccc]# tree . ├── a.out ├── build.sh ├── foo.c ├── foo.h ├─...

路漫漫其修远兮,吾将上下而求索 318
上一篇: 状态机设计软件-QM
下一篇: char与signed char, unsigned char的区别
Gplusplus
博客等级 码龄10年 42粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值