動態庫導出符號與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.pswp.cn/bicheng/83556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83556.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux(9)——進程(控制篇——下)

目錄 三、進程等待 1)進程等待的必要性 2)獲取子進程的status 3)進程的等待方法 wait方法 waitpid方法 多進程創建以及等待的代碼模型 非阻塞的輪訓檢測 四、進程程序替換 1)替換原理 2)替換函數 3&…

Datatable和實體集合互轉

1.使用已廢棄的 JavaScriptSerializer,且反序列化為弱類型 ArrayList。可用但不推薦。 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; using Sy…

阿里云服務器ECS詳解:云服務器是什么,云服務器優勢和應用場景及參考

云服務器ECS是阿里云眾多云產品中,最受用戶關注的產品,阿里云服務器提供多樣化的計算能力,支持x86、Arm架構,涵蓋CPU、GPU等多種服務器類型,滿足各種用戶需求。其便捷易用特性包括分鐘級交付、通用API和性能監控框架&a…

【Oracle】游標

個人主頁:Guiat 歸屬專欄:Oracle 文章目錄 1. 游標基礎概述1.1 游標的概念與作用1.2 游標的生命周期1.3 游標的分類 2. 顯式游標2.1 顯式游標的基本語法2.1.1 聲明游標2.1.2 帶參數的游標 2.2 游標的基本操作2.2.1 完整的游標操作示例 2.3 游標屬性2.3.1…

pikachu靶場通關筆記11 XSS關卡07-XSS之關鍵字過濾繞過(三種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 3、攻擊思路 二、滲透實戰 1、探測過濾信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合,通過對XSS關卡源碼的代碼審計找到安…

XML 元素:基礎、應用與優化

XML 元素:基礎、應用與優化 引言 XML(可擴展標記語言)作為一種數據交換的標準格式,廣泛應用于互聯網數據交換、數據存儲等領域。XML 元素是 XML 文檔的核心組成部分,本文將深入探討 XML 元素的概念、特性、應用以及優化方法。 一、XML 元素概述 1.1 XML 元素的定義 X…

【Axure高保真原型】交通事故大屏可視化分析案例

今天和大家分享交通事故大屏可視化分析案例的原型模板,包括餅圖分類分析、動態顯示發生數、柱狀圖趨勢分析、中部地圖展示最新事故發現地點和其他信息、右側列表記錄發生事故的信息…… 通過多種可視化圖表展示分析結果,具體效果可以點擊下方視頻觀看或…

HCIP(BGP基礎)

一、BGP 基礎概念 1. 網絡分類與協議定位 IGP(內部網關協議):用于自治系統(AS)內部路由,如 RIP、OSPF、EIGRP,關注選路效率、收斂速度和資源占用。EGP(外部網關協議)&a…

【HarmonyOS 5】 ArkUI-X開發中的常見問題及解決方案

一、跨平臺編譯與適配問題 1. 平臺特定API不兼容 ?問題現象?:使用Router模塊的replaceUrl或startAbility等鴻蒙專屬API時,編譯跨平臺工程報錯cant support crossplatform application。 ?解決方案?: 改用ohos.router的跨平臺封裝API&a…

Matlab2018a---安裝教程

目錄 壹 | 引 言 貳 | 安裝環境 叁 | 安 裝 肆 | 結 語 壹 | 引 言 大家好,我是子正。 最近想學習一下DSP數字信號處理有關的知識,要用到Matlab進行數據處理,于是又重新把Matlab撿了回來; 記得上學那會兒用的還是Matlab2012a&#xff…

分布式流處理與消息傳遞——Kafka ISR(In-Sync Replicas)算法深度解析

Java Kafka ISR(In-Sync Replicas)算法深度解析 一、ISR核心原理 #mermaid-svg-OQtnaUGNQ9PMgbW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQtnaUGNQ9PMgbW0 .error-icon{fill:#55222…

ARM GIC V3概述

中斷類型 locality- specific peripheral interrupt(LPI):LPI是一個有針對性的外設中斷,通過affinity路由到特定的PE。 為非安全group1中斷邊沿觸發可以通過its進行路由沒有active狀態,所以不需要明確的停用操作LPI總…

藍橋杯國賽訓練 day1

目錄 k倍區間 舞獅 交換瓶子 k倍區間 取模后算組合數就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…

安裝和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服務器詳細實錄6

前言 昨天更新了四篇博客,我們順利的 安裝了 ubuntu server 服務器,并且配置好了 ssh 免密登錄服務器,安裝好了 服務器常用軟件安裝, 配置好了 zsh 和 vim 以及 通過 NVM 安裝好Nodejs,還有PNPM包管理工具 。 作為服務器的運行…

鴻蒙版Taro 搭建開發環境

鴻蒙版Taro 搭建開發環境 一、配置鴻蒙環境 下載安裝 DevEco 建議使用最新版本的 IDE,當前為 5.0.5Release 版本。 二、創建鴻蒙項目 打開 DevEco,點擊右上角的 Create Project,在 Application 處選擇 Empty Ability,點擊 Ne…

Could not get unknown property ‘mUser‘ for Credentials [username: null]

最近遇到jekins打包報錯: Could not get unknown property mUser for Credentials [username: null] of type org.gradle.internal.credentials.DefaultPasswordCredentials_Decorated。 項目使用的是gradle,通過pipeline打docker包;因為ma…

Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例

Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例 一、項目結構 src/main/java/com/example/demo/ ├── config/ │ ├── DataSourceConfig.java # 數據源配置 │ ├── MyBatisPlusConfig.java # MyBatis-Plus配置 ├── constant/ │…

android binder(1)基本原理

一、IPC 進程間通信(IPC,Inter-Process Communication)機制,用于解決不同進程間的數據交互問題。 不同進程之間用戶地址空間的變量和函數是不能相互訪問的,但是不同進程的內核地址空間是相同和共享的,我們可…

高密爆炸警鐘長鳴:AI為化工安全戴上“智能護盾”

一、高密爆炸:一聲巨響,撕開化工安全“傷疤” 2025年5月27日,山東高密友道化學有限公司的車間爆炸聲,像一把利刃劃破了化工行業的平靜。劇烈的沖擊波將車間夷為平地,黑色蘑菇云騰空而起,刺鼻的化學氣味彌漫…

雙擎驅動:華為云數字人與DeepSeek大模型的智能交互升級方案

一、技術融合概述 華為云數字人 華為云數字人,全稱:數字內容生產線 MetaStudio。數字內容生產線,提供數字人視頻制作、視頻直播、智能交互、企業代言等多種服務能力,使能千行百業降本增效。另外,數字內容生產線&#…