博主目的是把两个开源项目合并到一起,但是一个是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