LINUX下的C C++ 混编

http://www.cppblog.com/TianShiDeBaiGu/archive/2012/02/10/c_cpp_mix.html

 

  1. 项目需要对接另外两个公司的程序接口,其中一个公司使用纯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)
源文件有:declaration.h  implementation.cpp main.c
后缀名可以知道implementation.cpp是C++文件的实现。main.c是C实现的主函数,头文件
declaration.h是公共头文件
分别看看内部代码:
//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

//filename main.c
#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++编译为可加载动态库的实例

//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;
}

//dl_op/test.c
#include <stdio.h>

void test_func()
{
    printf("test_func:in a dynamic library\n");
}
Makefile
#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

 

posted @ 2013-09-28 17:42  myblogszz  Views(866)  Comments(0Edit  收藏  举报