linux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并
来源:互联网 发布:淘宝介入卖家没有发票 编辑:程序博客网 时间:2024/05/17 17:41
博主目的是把两个开源项目合并到一起,但是一个是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
- #include "myclass.h"
- using namespace std;
- void Myclass::Operation()
- {
- cout << "hello c++" <<endl;
- }
4 interface.cpp
然后在c语言项目中的main函数这样调用:
5 main.c
}
#endif
#ifdef __cplusplus
#include <iostream>
#include <time.h>
#endif
#ifdef __cplusplus
extern "C"{
#endif
}
#endif
- linux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并
- Linux下编译C语言程序
- Linux下编译C语言程序
- Linux下C语言中调用其他程序的办法
- Linux中编译C语言程序
- 【C语言】Linux操作环境下编译C程序
- c语言的程序
- [编译环境][gcc]16位程序中汇编代码与C语言代码的混合编译
- VS2008编译C语言程序
- VS2005编译C语言程序
- gcc编译c语言程序
- C语言程序编译过程
- c语言程序编译过程
- C语言:分步编译一个C程序
- C语言程序调用SQLite
- C语言调用python程序
- matiab调用C语言程序
- Java 调用C语言程序
- Linux Oracle删除归档日志
- 笔试选择题9
- 软考之我见——论文
- php中XML与数组的相互转换
- 类似于jquery中的链式结构封装
- linux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并
- mysql索引类型normal,unique,full text解释
- array_map和array_walk
- Centos下开机自启动node.js程序(问题及总结)
- maven 编译时跳过单元测试
- mongodb 高级查询
- mkt android 更改编译选项
- 其他
- 关于图片压缩