c和C++代码相互调用

来源:互联网 发布:网络大电影市场收益 编辑:程序博客网 时间:2024/04/24 08:01

前言

本文对C和C++的相互调用,作出一些实例。C++支持函数重载,但我认为函数重载的特性和C语言中的函数调用其实是一样的,但是C++向我们隐藏了一些细节,她会将函数的名字(专业点,这叫做符号)重新进行组织。

例如:

void print(void);void print(int);void print(int,int);

在编译器内部这些函数符合可能会转换成

void _g_fun_print_void(void);void _g_fun_print_int(int);void _g_fun_print_int_int(int,int);

说道底,这些函数的名字依然是不一样的。这是C++实现函数重载的机制,不同编译器具体实现可能不一样,但机制是一样的。

extern "C" 可以阻止C++编译器进行类型的这种符号转换,而是按照C的规约进行编译和链接。

一、C++调用C

声明

//foo.h#ifdef __cplusplusextern "C" {#endifvoid print();#ifdef __cplusplus}#endif

实现

//foo.c#include "foo.h"    //相当于 void print();#include <stdio.h>void print(){    printf("hello world\n");}

编译

gcc -c foo.car cr libfoo_s.a foo.o                              //静态库gcc -fPCI -shared -o libfoo_d.so foo.o     //动态库

C++调用C

//bar.cpp#include "foo.h"int main(){    print();    return 0;}

静态链接

g++ foo.cpp -cg++ foo.o libfoo_s.a./a.out

动态链接

g++ foo.cpp -cg++ foo.o -L. -lfoo_d

运行

运行时,需要动态链接,而这些函数要在动态链接路径中去寻找,两种方法,一种是修改/etc/ld.so.conf文件,将动态库所在的路径加入到这个文件中;第二是修改环境变量LD_LIBRARY_PATH,将动态库所在路径加进来

echo `pwd` >> /etc/ld.so.confldconfig./a.out
或者

export LD_LIBRARY_PATH=~/work:$LD_LIBRARY_PATH       注:libfoo_d.so文件存在于~/work目录下./a.out



二、C调用C++


//foo.cpp#include "foo.h"      //还是上边那个foo.h文件#include <iostream>void print(){    std::cout << "hello world" << std::endl;}


编译

g++ foo.cpp -cg++ -fPCI -shared -o libfoo_d.so foo.o   //动态库

//bar.c#include "foo.h"int main(){    print();    return 0;}

编译,运行

gcc -c bar.cgcc bar.o -L. -lfoo_d./a.out






原创粉丝点击