LINUX下的C C++ 混编
来源:互联网 发布:铝合金门 知乎 编辑:程序博客网 时间:2024/06/09 19:54
- 项目需要对接另外两个公司的程序接口,其中一个公司使用纯C实现,一个使用C++实现,我们需要把C++的库封装给纯C的框架,C++的库值提供了C++的类头文件和自己的库,需要将C++的部分包装为纯C调用方式,提供给外部
先看Makefile
SRCFILES := implementation.cpp declaration.h main.c
OBJFILES := implementation.o main.o
CXX := g++
CC := gcc
TARGET=c_cpp_mix
$(TARGET):$(OBJFILES)
$(CXX) $(OBJFILES) -o $@
$(OBJFILES):$(SRCFILES)
$(CXX) implementation.cpp -c\
$(CC ) main.c -c
#或者
#$(CXX) implementation.cpp -c -fPIC -shared -o libcpp.so
#$(CC ) main.c -c
#$(CC) main.o -L./ -lcpp -o c_cpp_ix
#运行时导出系统环境 export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
.PHONY:
clean:.PHONY
rm -rf $(OBJFILES) $(TARGET)
OBJFILES := implementation.o main.o
CXX := g++
CC := gcc
TARGET=c_cpp_mix
$(TARGET):$(OBJFILES)
$(CXX) $(OBJFILES) -o $@
$(OBJFILES):$(SRCFILES)
$(CXX) implementation.cpp -c\
$(CC ) main.c -c
#或者
#$(CXX) implementation.cpp -c -fPIC -shared -o libcpp.so
#$(CC ) main.c -c
#$(CC) main.o -L./ -lcpp -o c_cpp_ix
#运行时导出系统环境 export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
.PHONY:
clean:.PHONY
rm -rf $(OBJFILES) $(TARGET)
源文件有:declaration.h implementation.cpp main.c
后缀名可以知道implementation.cpp是C++文件的实现。main.c是C实现的主函数,头文件declaration.h是公共头文件
分别看看内部代码:
#include "declaration.h"
void cpp_implementation_fun()
{
std::cout<<"hello, this is a c++ implementation"<<std::endl;
}
分别看看内部代码:
//filename implementation.cpp
#include <iostream>#include "declaration.h"
void cpp_implementation_fun()
{
std::cout<<"hello, this is a c++ implementation"<<std::endl;
}
//filename declaration.h
#ifndef DECLARATION_H
#define DECLARATION_H
#ifdef __cplusplus
extern "C"{ //当使用g++编译时,这里将会被编译器识别,使用gcc编译时则跳过,这样这个公共头文件对不同的编译器产生不同的代码
#endif
void cpp_implementation_fun();
#ifdef __cplusplus
}
#endif
#endif //DECLARATION_H
#ifndef DECLARATION_H
#define DECLARATION_H
#ifdef __cplusplus
extern "C"{ //当使用g++编译时,这里将会被编译器识别,使用gcc编译时则跳过,这样这个公共头文件对不同的编译器产生不同的代码
#endif
void cpp_implementation_fun();
#ifdef __cplusplus
}
#endif
#endif //DECLARATION_H
//filename main.c
#include <stdlib.h>
#include <stdio.h>
#include "declaration.h"
int main()
{
cpp_implementation_fun();
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include "declaration.h"
int main()
{
cpp_implementation_fun();
return 0;
}
在linux下,创建上面三个文件,然后make即可编译。
三种编译方式:
目标编译:
g++ implementation.cpp -c
gcc main.c -c
1.g++ implementation.o main.o -o c_cpp_mix
2.g++ -fPIC -shared implementation.o implementation.so
gcc implementation.so main.o -o c_cpp_mix
3.gcc implementation.o main.o -L./ -lstdc++ -o c_cpp_mix
当然如果直接用g++编译两个文件也可以,那就不是本文要的效果。
另外附加C++编译为可加载动态库的实例
g++ implementation.cpp -c
gcc main.c -c
1.g++ implementation.o main.o -o c_cpp_mix
2.g++ -fPIC -shared implementation.o implementation.so
gcc implementation.so main.o -o c_cpp_mix
3.gcc implementation.o main.o -L./ -lstdc++ -o c_cpp_mix
当然如果直接用g++编译两个文件也可以,那就不是本文要的效果。
另外附加C++编译为可加载动态库的实例
//dl_op/main.c
#include <stdlib.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("main+\n");
void *handle = dlopen("./libtest.so", RTLD_LAZY); //Runtime Loader, I guess
if( (void *)0 == handle){
//error handle
printf("unable to find libtest.so\n");
exit(-1);
}
void (*a_dl_func) (void);
a_dl_func = dlsym(handle, "test_func");
if(NULL != dlerror() ){
//error handle
printf("unable to find test_func\n");
exit(-1);
}
a_dl_func();
dlclose(handle);
printf("main-\n");
return 0;
}
#include <stdlib.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("main+\n");
void *handle = dlopen("./libtest.so", RTLD_LAZY); //Runtime Loader, I guess
if( (void *)0 == handle){
//error handle
printf("unable to find libtest.so\n");
exit(-1);
}
void (*a_dl_func) (void);
a_dl_func = dlsym(handle, "test_func");
if(NULL != dlerror() ){
//error handle
printf("unable to find test_func\n");
exit(-1);
}
a_dl_func();
dlclose(handle);
printf("main-\n");
return 0;
}
//dl_op/test.c
#include <stdio.h>
void test_func()
{
printf("test_func:in a dynamic library\n");
}
Makefile#include <stdio.h>
void test_func()
{
printf("test_func:in a dynamic library\n");
}
#dl_op/Makefile
all:
export LD_LIBRARY_PATH=./:/usr/locale/lib:/lib:$LD_LIBRARY_PATH;\
gcc -fPIC -shared test.c -o libtest.so;\
gcc main.c -o a.out -g -ldl
all:
export LD_LIBRARY_PATH=./:/usr/locale/lib:/lib:$LD_LIBRARY_PATH;\
gcc -fPIC -shared test.c -o libtest.so;\
gcc main.c -o a.out -g -ldl
0 0
- LINUX下的C C++ 混编
- Linux下C和C混编的一个例子
- mac下matlab和c混编的问题
- ARC 下 C++/OC 混编计数器的问题
- C、C++、OC混编
- c,c++,oc混编
- 关于 C++ 和 C 的混编
- Objective-C和C++混编的要点
- C/C++混编的命令行加密工具
- C与C++的混编方法
- 记忆C++ , C的混编问题
- 关于matlab与C混编的问题
- Objective-C和C++混编的要点
- C与C++与OC的混编
- Swift 和 Objective-C 混编的 Framework
- 一个简单的C/C++混编Makefile
- Fortran & C 混编
- C Fortran混编设置
- xcode环境变量
- QT在WIN7下开发环境的搭建
- Ubuntu Linux中vsFTP添加用户
- C语言中的static 详细分析
- oracle基础之临时表
- LINUX下的C C++ 混编
- Java面试参考指南(一)
- hdu2374 A Game with Marbles(简单数学题)
- Java整理
- 对QT的编译器mingW与cygwin的一点理解
- HDU - 3555 Bomb (数位DP)
- ./zabbix_get -s 192.168.1.4 -p 10050 -k "system.cpu.load[all,avg1]"
- ubuntu安装ftp服务器(一般配置)
- [朋友写的]取一个数组的前9个最大值