研究了一下关于c/c++编译器关于导出函数的不同处理

原创 2015年07月09日 14:14:04

刚刚我在用试验ffmpeg解码库解码视频文件的时候,写好了但是提示链接错误,就网上找了一些文章,现在总结一下,如有错误或不严谨的地方请告之,免得我坑害别人,先谢过了!

总所周知,c++兼容c,但是在c++中调用纯c写的库时,编译链接目标文件的时候回提示找不到标识符,这是因为c++支持重载和多态的而c不支持的缘故.所谓重载就是函数名相同而参数个数或者参数类型不同,c++编译器在处理这个问题的时候是把函数名写成函数名+参数类型的形式,比如:int sum(int,int);c++编译器编译在符号表的名字是_sum_int_int(重载和多态其实就是编译器帮了个小忙),  而c编译器编译在符号表中的函数名是_sum;所以在C++项目中调用纯C库导出的函数时会编译链接目标文件时错误提示找不到函数,因为C编译器导出的符号不带参数类型信息,而C++编译器在链接时是按照有参数类型的名字来找函数的,所以LINK:error.

解决这个问题的方法一是在库头文件的导出函数声明前加extern "C",在C++项目中编译链接的时候,编译器会根据C的函数符号规则去找函数.
方法二不改库,在C++项目中加载头文件的#include语句用extern "C"{}的花括号包起来,这样C++编译器也会以C的规则生成函数符号去找函数进行链接.
extern "C"也不可乱用,比如你用他包住一个全局变量和一个类的声明,而类中一个成员变量和全局变量重名,普通情况下这样做是没有问题的,那是因为按照C++的编译规则会把同名成员变量在符号库中的名字是 "类名.变量名"这种形式的,而加上extern "C"之后编译符号库中的名字就会是 "变量名",全局变量在符号库中的名字也是"变量名",此时重复了产生编译错误.

相关文章推荐

ZooKeeper场景实践:(1)准备工作

ZooKeeper是一个高可用的分布式数据管理与系统协调框架。保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题。 有人认为ZooKeeper之于分布式...

zookeeper的单机多实例配置和分布式配置

单机多实例配置: #生成配置文件,配置文件名随便,这里是zoo.cfg cp /data/apache/zookeeper/conf/zoo_sample.cfg  /data/apache/zoo...
  • mm_bit
  • mm_bit
  • 2016年05月03日 16:58
  • 2698

动态加载DLL实现不同DLL的相同导出函数调用问题

假设这样的情景:         一个exe加载了两个dll(dll1和dll2,并使用隐式加载)。dll和dll2都同时向外导出一个函数:         int add(int a, ...

__stdcall,__cdcel,extern c 和导出函数名

无论c或c++都会对导出函数改名或不改名,无论你是静态还是动态调用一个导出函数,都可能碰上改名后导致的调用失败(甚至可能是调用约定不同而导致清理堆栈出错,造成崩溃),下面分析一下改名和调用约定之间的关...

s3c2410_gpio_cfgpin等内核导出函数

//这里面的函数都是内核导出函数/plat-s3c24XX/gpio.c中 #include #include #include #include #include #inclu...

在DLL编程中,导出函数为什么需要extern "C"

一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”,    extern 表示这是个全局函数,可以供各个其他的函数调用;   “C” 表示编译时按照 C编译器的方式进...

Linux驱动开发中s3c2410关于gpio的内核导出函数的解读

这些函数的实现在linux内核源代码的/arch/arm/plat_s3c24xx/gpio.c中实现,这些函数的具体内容就不在这里介绍了,可以通过源代码进行查看,这里对这些函数的用法进行解读: 1....

C++动态链接库导出函数或者类

1、新建一个Win32 Project,然后选择dll程序。 2、添加头文件Student.h#pragma once#ifndef _STUDENT_H_ #define _IMP_EXP_CLA...

C#调用C++类的导出函数

C# 需要调用C++东西,但是有不想做成COM,就只好先导出类中的函数处理。 抛砖了! 测试IDE版本为 visual studio 2008 C++部分: 1. 首先建一个C++WI...

C#中调用C++的dll的参数为指针类型的导出函数

C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)          严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧。      ...
  • jjjfox
  • jjjfox
  • 2011年08月12日 14:07
  • 595
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:研究了一下关于c/c++编译器关于导出函数的不同处理
举报原因:
原因补充:

(最多只允许输入30个字)