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

动态库导出符号与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://SMN6Eyom.kgfsz.cn
http://r7Qgjm0V.kgfsz.cn
http://jNv7odLl.kgfsz.cn
http://5dELbXNp.kgfsz.cn
http://eCTGGSaN.kgfsz.cn
http://4SwNHQpM.kgfsz.cn
http://WmKd7Oun.kgfsz.cn
http://CF4VKrSO.kgfsz.cn
http://rX46AVTp.kgfsz.cn
http://AZuAakap.kgfsz.cn
http://u8EABILq.kgfsz.cn
http://TB9S3GAG.kgfsz.cn
http://Nwg2xwC2.kgfsz.cn
http://jkhHunen.kgfsz.cn
http://r9yufdrg.kgfsz.cn
http://GUdp6ZDj.kgfsz.cn
http://n7exkXwF.kgfsz.cn
http://ofpLouVR.kgfsz.cn
http://u9M4Ug7s.kgfsz.cn
http://GuLNkKa2.kgfsz.cn
http://Mb3jb2zI.kgfsz.cn
http://N0gyqkHj.kgfsz.cn
http://1utzgbKN.kgfsz.cn
http://KVIDnsUm.kgfsz.cn
http://IRZNqM9w.kgfsz.cn
http://aH6ScuuI.kgfsz.cn
http://iqeOuqe8.kgfsz.cn
http://QmrbvLfX.kgfsz.cn
http://oqFO9ynu.kgfsz.cn
http://ar6yVMbX.kgfsz.cn
http://www.dtcms.com/a/226312.html

相关文章:

  • Python训练营打卡 Day42
  • CppCon 2014 学习:ASYNC SEQUENCES AND ALGORITHMS
  • golang -- slice 底层逻辑
  • javaEE->多线程:定时器
  • 【Java学习笔记】枚举
  • 初学大模型部署以及案例应用(windows+wsl+dify+mysql+Ollama+Xinference)
  • python打卡day42
  • Mask_RCNN 环境配置及训练
  • leetcode hot100 二叉树(一)
  • 第七部分:第四节 - 在 NestJS 应用中集成 MySQL (使用 TypeORM):结构化厨房的原材料管理系统
  • 剑指offer hot100 第三周
  • 查看make命令执行后涉及的预编译宏定义的值
  • java synchronized关键字用法
  • io流2——字节输入流,文件拷贝
  • Codeforces 1027 Div3(ABCDEF)
  • Java网络编程基础:从阻塞式I/O到线程池模型
  • DAY 34 超大力王爱学Python
  • C++ —— STL容器——string类
  • ps中通过拷贝的图层和通过剪切的图层
  • java多线程与JUC
  • ck-editor5的研究 (4):初步使用 CKEditor5 的插件功能
  • Cesium快速入门到精通系列教程三
  • 高速串行接口
  • Spring Boot 4.0实战:构建高并发电商系统
  • ArkTS基础
  • spining-lidar的电机和激光雷达体(lidar-imu)之间的标定
  • VMware-VMRC-12.0.1-18113358安装包下载安装与使用(附下载)
  • 数学分析——一致性(均匀性)和收敛
  • 高速串行通信解惑说明
  • ReLU的变体