当前位置: 首页 > article >正文

动态库导出符号与extern “C“

1. windows下动态库导出符号

根据C/C++语法规则,函数声明中的修饰符(如__declspec(dllexport))可以放在返回类型之前或返回类型之后、函数名之前。这两种方式在功能上是等价的,编译器会以相同的方式处理。

__declspec(dllexport) int MyGlobalFunc(int a, int b);
int __declspec(dllexport) MyGlobalFunc(int a, int b);

注:
声明函数/类的 签名和导出属性(如 extern “C” 或 __declspec(dllexport)),告知编译器按特定规则生成符号名。编译器在处理 CPP 文件时,会根据头文件声明自动应用导出规则,无需在实现中重复指定。

2. linux下动态库导出符号

Linux 系统中导出动态库(通常称为共享对象 .so 文件)不需要使用 __declspec(dllexport)。这是 Linux 与 Windows 动态链接机制的核心区别,主要原因如下:

Linux下,动态库符号默认全局可见性,Linux 的动态库(.so)基于 ELF(Executable and Linkable Format)格式,默认导出所有全局函数和变量(除非显式隐藏。无需额外声明导出修饰符(如 Windows 的 __declspec(dllexport)),编译器会直接导出符号。

linux下有个符号隐藏控制,可以控制符号的可见性,即使用 GCC 的编译选项 -fvisibility=hidden,隐藏所有未显式标记的符号。通过 attribute((visibility(“default”))) 显式导出目标函数/类,例如:

// 显式导出函数 
__attribute__((visibility("default"))) void my_exported_func(); 

3. extern "C"修饰符

c++代码使用,强制导出符号按c语言的规则,即不改写函数名,一般有两种写法,

  • 批量修饰

    #ifdef __cplusplus
    extern "C" {
    #endif__declspec(dllexport) int MyGlobalFunc1(int a, int b);__declspec(dllexport) int MyGlobalFunc2(int a, int b);//略...#ifdef __cplusplus
    }
    #endif
    
  • 单个修饰(简化下,就省略了#ifdef __cplusplus,因为均是c++项目,上面是演示下如何使用宏去正确使用extern “C”)

    extern "C" __declspec(dllexport) int MyGlobalFunc(int a, int b);
    

注:
声明函数/类的 签名和导出属性(如 extern “C” 或 __declspec(dllexport)),告知编译器按特定规则生成符号名。编译器在处理 CPP 文件时,会根据头文件声明自动应用导出规则,无需在实现中重复指定。

http://www.lryc.cn/news/2395323.html

相关文章:

  • 小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧
  • `docker commit` 和 `docker save`区别
  • 【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
  • SCSAI平台面向对象建模技术的设计与实现
  • pikachu通关教程-CSRF
  • 智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代
  • Python爬虫实战:研究Aiohttp库相关技术
  • 【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘
  • [神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果
  • 小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战
  • n8n:技术团队的智能工作流自动化助手
  • Flink 核心机制与源码剖析系列
  • 华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机
  • 华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • LabVIEW Val (Sgnl) 属性
  • STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联
  • DAY 35 超大力王爱学Python
  • 【数据结构】图的存储(十字链表)
  • 005 flutter基础,初始文件讲解(4)
  • Redis最佳实践——秒杀系统设计详解
  • STM32软件spi和硬件spi
  • MATLAB实战:人脸检测与识别实现方案
  • 深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)
  • 【Linux】shell的条件判断
  • 第九天:java注解
  • 十一、【核心功能篇】测试用例管理:设计用例新增编辑界面
  • react-native的token认证流程
  • ERP系统中商品定价功能设计:支持渠道、会员与批发场景的灵活定价机制
  • Spring是如何实现属性占位符解析
  • 数据结构之ArrayList