linux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并

本文介绍了在Linux环境下,如何将C语言和C++语言的项目合并,并实现相互调用。通过修改Makefile,分别使用gcc和g++编译.c和.cpp文件,最终链接时使用-lstdc++。在C程序中调用C++函数,可以通过创建C兼容的接口或使用extern "C"来实现。
摘要由CSDN通过智能技术生成

博主目的是把两个开源项目合并到一起,但是一个是c编写,一个是c++编写,在linux环境下实现两个项目的融合,以及互相的调用。

首先编译,先贴出来我的makefile文件:

GPU=1
OPENCV=1
DEBUG=0


ARCH= --gpu-architecture=compute_30 --gpu-code=compute_30


VPATH=./src/
EXEC=darknet
OBJDIR=./obj/


CC=gcc
GCC=g++ -std=c++11 #兼容 c++11
NVCC=nvcc
OPTS=-Ofast
LDFLAGS= -lm -pthread -lstdc++ 
COMMON= 
CFLAGS=-Wall -Wfatal-errors 


ifeq ($(DEBUG), 1) 
OPTS=-O0 -g
endif


CFLAGS+=$(OPTS)


ifeq ($(OPENCV), 1) 
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv` 
COMMON+= `pkg-config --cflags opencv` 
endif


ifeq ($(GPU), 1) 
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif


OBJ=gemm.o ...//c项目的


OBJ+=plate_locate.o ...//c++项目的

ifeq ($(GPU), 1) 
OBJ+=convolutional_kernels.o ...//c项目的

OBJS = $(addprefix $(OBJDIR), $(OBJ))
DEPS = $(wildcard src/*.h) Makefile


all: obj results $(EXEC)


$(EXEC): $(OBJS)
$(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS)


$(OBJDIR)%.o: %.c $(DEPS)
$(CC) $(COMMON) $(CFLAGS) -c $< -o $@


$(OBJDIR)%.o: %.cpp $(DEPS)
$(GCC) $(COMMON) $(CFLAGS) -c $< -o $@


$(OBJDIR)%.o: %.cu $(DEPS)
$(NVCC) $(ARCH) $(COMMON) --compiler-options "$(CFLAGS)" -c $< -o $@


obj:
mkdir -p obj
results:
mkdir -p results


.PHONY: clean


clean:
rm -rf $(OBJS) $(EXEC)





inux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并

编译.c用gcc,编译.cpp用g++,最后的链接:gcc -lstdc++,采用静态链接。关于为什么编译要分别使用gcc,g++,因为他们c和c++的编译方式不同

所以想要在c中调用c++,就必须把c++程序按照c的编译方式来编译生成静态链接库(.o文件)。对于函数调用,编译器只要知道函数的参数类型和返回值以及函数名就可以进行编译连接。那么为了让C调用C++接口或者是说C++调用C接口,就必须是调用者和被调用者有着同样的编译方式。这既是extern "C"的作用,extern “C”是的程序按照C的方式编译。


问题在于如何在c中调用c++的函数,下面列出两种方式,使用情况请看官自己分辨:

第一种方法是用一个接口做桥梁。

比如在原本的c++项目中有类hello:

1.myclass.h

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class Myclass {  
  5. public:  
  6.     Myclass(){}  
  7.     ~Myclass(){}  
  8.     void Operation();  
  9. };  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值