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
- c和C++代码相互调用
- C和C++相互调用
- C和C++相互调用
- C和C++相互调用
- OC和C相互调用
- C和C++相互调用
- C和C++相互调用
- C和C++相互调用
- 汇编和C相互调用
- C和C++相互调用
- C和C++相互调用
- C和C++相互调用
- c和c++相互调用
- Object-C Swift C++代码相互调用。
- c/c++代码如何相互调用
- asm和c的相互调用
- C函数和C++函数相互调用
- C 和C++ 之间的相互调用
- 拓扑排序+入度检测
- signal(SIGPIPE,SIG_IGN)问题
- 数字图像处理基本算法实现(2)--section3.3直方图处理
- fedora起步第一天
- Android Intent常用用法
- c和C++代码相互调用
- Deformable Probability Maps
- 在虚拟机中搭建svn 服务端
- Multiuser screen
- 设置对话框、static和group的背景色和字体颜色
- 由锚点失效引发的hasLayout探究
- 人体动作识别
- 状态无关特性
- 大端模式和小端模式