通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪些函数是 DLL 内部自己使用;而在 Linux 下不存在 dllexport 这样的指示字,默认情况下 GCC 编译 SO(共享库)时把代码中的所有函数都导出了,那么如何实现 Windows 下的那种效果,由我们自己来控制共享库导出函数呢?

其实在 Linux 下也有类似的控制机制。在 GCC 帮助文档中,对 -fvisibility=default|internal|hidden|protected 参数及其取值有这样一段描述:
a superior solution made possible by this option to marking things hidden when the default is public is to make the default hidden and mark things public. This is the norm with DLL's on Windows and with -fvisibility=hidden and "__attribute__((visibility("default")))" instead of "__declspec(dllexport)" you get almost identical semantics with identical syntax. This is a great boon to those working with cross-platform projects.
需要了解的是,在 Linux下,源文件中的所有函数的 visibility 属性都被默认设置为 public,在编译命令中加入 -fvisibility=hidden 参数后,会将所有默认的 public 属性变为hidden。此时,如果对函数设置 __attribute__((visibility("default"))) 参数,则该函数按 public 属性处理,-fvisibility=hidden 参数不会对该函数起作用。所以,针对 GCC 设置了 -fvisibility=hidden 参数之后,只有设置了 __attribute__((visibility("default"))) 属性的函数才是对外可见的,如此则效果等同于 Visual Studio 下的 __declspec(dllexport) 定义。比如:

extern int foo(int a, int b, int c) __attribute__((visibility("default")));

这样声明即可。

Linux 下 GCC 编译共享库控制导出函数的方法的更多相关文章

  1. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  2. linux下gcc编译的参数详细说明

    参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog. ...

  3. Linux下Qt创建共享库与链接共享库详解

    随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库:或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库.本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的 ...

  4. linux下gcc编译多个源文件、gdb的使用方法

    一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认 ...

  5. linux 下gcc 编译结构体问题

    最近在linux 学习c语言的编程,发现好多原来在vs 上的在linux 都编译不过去,今天就遇到了一个问题就是结构体的编译的问题, 结构体大概的定义是 struct Node{ int a; int ...

  6. Linux下Qt调用共享库文件.so

    修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...

  7. Linux下gcc编译控制动态库导出函数小结

    根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility(" ...

  8. linux下GCC编译文件

    Linux终端使用技巧: Ctrl+Alt+T打开终端 Ctrl+c死循环退出程序 Shift+Ctrl+T:新建标签页 Shift+Ctrl+N:新建窗口 Shift+Ctrl+Q:关闭终端 终端中 ...

  9. Linux下指定so共享库的加载路径

    转载地址:https://blog.csdn.net/zorelemn/article/details/52596293,做了部分修改 一.库文件的搜索路径: 1.在配置文件/etc/ld.so.co ...

随机推荐

  1. shrio 权限管理filterChainDefinitions过滤器配置

    /** * Shiro-1.2.2内置的FilterChain * @see ============================================================= ...

  2. OpenCV2:第八章 界面事件

    一.简介 OpenCV中提供了程序界面中的鼠标和键盘事件 二.鼠标事件 //  设置鼠标回调函数 void setMouseCallback ( const string& winname, ...

  3. 项目中多条数据保存的json实例

    //js代码function checkCode(num){ var typeid = $("#typeid").val(); if(typeid == "") ...

  4. java第九次作业:第九章例题3个

    作业1: 例题9.1 制作圆类,根据圆的半径求出周长及面积 package com.swift; //抽象的方法构成类,把属性和方法进行封装 public class Circle { // 两个方面 ...

  5. nodejs 设置安装包路径的取消和安装cnpm

    安装cnpm: $ npm install -g cnpm --registry=https://registry.npm.taobao.org 配置nodejs的npm安装包路径: npm conf ...

  6. linux中mysql自带同步

    今天打算给一个做主备web服务器.考虑到数据库的同步,现在自己本地虚拟机做个实验. 经过慎重考虑(其实就是参考了下论坛大家的看法). 最后决定用mysql自带的同步设置. 话不多说 配置过程如下.

  7. 离线功能对比:service worker和applicationCache

    SW 复杂,事件驱动,可以拦截请求,和缓存这些请求的响应数据,实现的效果更加灵活 AppCache 简单易用,声明式的将要缓存的文件清单声明在一个文件中.由于设计上的原因,它存在一些问题,导致难以运用 ...

  8. RN踩坑

    使用夜神 使用夜神作为模拟器,这个模拟器启动就会监听62001端口. 开发工具与模拟器的通信都是通过adb.夜神模拟器的安装目录/bin下有一个adb.exe,android sdk tools下也有 ...

  9. Could not connect to Redis at IP No route to host

    这个问题是在用远程去访问redis出现的 原因:是服务器新装系统  iptables这个的问题 解决办法: sudo iptables -F 轻松解决

  10. python--内置函数03

    一 . 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n \t \b 单词的边界 \W 非xxx \D \S [ ] 字符组 or的关系 [^ ...