zoukankan      html  css  js  c++  java
  • LINUX下的C C++ 混编

    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+ ");
        void *handle = dlopen("./libtest.so", RTLD_LAZY);  //Runtime Loader, I guess
        
        if( (void *)0 == handle){
            //error handle
            printf("unable to find libtest.so ");
            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 ");
            exit(-1);
        }

        a_dl_func();

        dlclose(handle);

        printf("main- ");
        return 0;
    }

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

    void test_func()
    {
        printf("test_func:in a dynamic library ");
    }
    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
  • 相关阅读:
    DevExpress_Winform_使用汇总
    SVN的可视化日志统计工具StatSVN
    jenkins搭建.Net项目自动构建
    关闭tab时,定位到导航栏对应的激活tab
    DevExpress.XtraNavBar.NavBarControl 模拟单击导航的选项事件
    选中Tab控件单击事件,点击tab头,定位到导航栏的选项,为选中状态 ,DevExpress.XtraNavBar.NavBarControl 导航控件定位或选中状态 另导航的选项为选中状态.
    WCF服务部署到IIS问题汇总
    iOS多线程编程
    最新版SDWebImage的使用
    前端入门系列之CSS
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318306.html
Copyright © 2011-2022 走看看